2011-09-01 65 views
4

我遵循有關如何在ASP.NET MVC使用溫莎和log4net的是AOPASP.NET MVC + WIndsor + Log4Net如何截取模型?

http://cangencer.wordpress.com/2011/06/02/asp-net-mvc-3-aspect-oriented-programming-with-castle-interceptors/

的優秀教程文章告訴我如何寫日誌的每個控制器的行動時不接觸任何控制器 文章還聲明我可以用模型中的方法來做到這一點,但沒有說明如何。

能否請你幫我

+0

爲什麼要截取MVC模型?恕我直言,這是一個代碼味道... –

回答

1

你可以寫你的模型完全一樣log4net的攔截器做同樣的方式攔截。 只能用作模型合約的ctor參數。

public ControllerModelInterceptor(IModel model) 
{ 
    this.model = model; 
} 
+0

謝謝,你的答案聽起來不錯,但我太新來這個框架來完全理解它。 – hormkralob

2

我是問題中的鏈接的作者,所以首先感謝您的客氣話。現在到了你的問題:

這是一個很大的困難和/或不切實際的在你的模型使用攔截器,因爲攔截工作,你應該只通過城堡容器訪問你的模型的實例。看到問題了嗎?

假設你有一個名爲Book模型對象,你想攔截上的所有通話,你需要確保你從未使用類似通過城堡Booknew Book(),只訪問實例。攔截器通過代理工作,並且在您自己創建對象的實例時不起作用。這意味着能夠有效地使用攔截器,您需要圍繞此構建整個應用程序,這可能不是最好的主意。即每次你想要一個Book的實例時,你需要問Castle而不是Container.Resolve<Book>()。我個人並不覺得這個方法很優雅。我認爲它打破了封裝和良好面向對象設計的原則。

攔截器很容易處理控制器,因爲所有的控制器都只在一次地方初始化,我們掛鉤的地方是ControllerFactory。然而,模型對象可以用不同的方式進行初始化,因爲它們確實應該描述您的域模型。

但是可能有幾種方法可以解決這個問題。第一個我能想到的是使用一個ORM,比如NHibernate,它已經在後臺使用了攔截器,你可以爲各種事件(比如保存,更新或者任何方法調用)調用攔截器。限制將是攔截器只能在從數據庫中檢索的模型上工作。

另一種選擇是使用編譯時重寫器,如Postsharp,它將爲您提供在編譯後重寫代碼的方法。通過這種方式,可以使用特定屬性添加和刪除您標記的每個方法的開始和結尾的其他調用。

+0

其實它不是我想攔截的模型,我想記錄SQL語句執行。我從來沒有使用NHibernate,並從您的答案,我認爲是時候我嘗試它。但我仍然不確定是否可以將NHibernate掛鉤到Windsor來編寫日誌。我可能會再次問。非常感謝喲。 – hormkralob

+0

@hormkralob,在這種情況下,nhib應該很適合你,因爲你可以很容易地記錄每個執行的sql語句。將NHibernate掛入Castle也很容易。 –