2011-12-08 39 views
3

在我正在處理的應用程序中,我創建了一個輕量級記錄器,它有兩個用途。使用枚舉「域」記錄的錯誤將記錄到數據庫中,而使用枚舉「應用程序」記錄的錯誤可以從服務中提取並顯示給用戶。使用Ninject2 InRequestScope時,Dispose是否可以進行清理?

我使用ninject InRequestScope允許維持在要求的範圍錯誤收集。

一個問題,我不確定的是,當我要調用函數錯誤記錄到數據庫中。該功能使用交易將所有錯誤推送到數據庫中。我的想法是讓錯誤記錄器使用IDisposable,然後從Dispose方法中調用LogErrorsToDatabase()方法。

這樣做有什麼問題嗎?

將ninject自動調用部署,或者我需要把它配置這樣做呢?

我第一次嘗試以注射服務爲Global.asax中,但是這有不可預見的問題。

編輯:我找到了一種更優雅的做法,以備將來參考,下面詳細介紹。

我首先創建一個自定義操作,過濾器和使用性能噴射來噴射IErrorLog服務:

public class LogErrorsAttribute : ActionFilterAttribute 
{ 
    [Inject] 
    public IErrorQueue ErrorQueue { private get; set; } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     ErrorQueue.CommitDatabaseLog(); 
     base.OnResultExecuted(filterContext); 
    } 
} 

我接下來要使用Ninject的BindFilter方法來此功能結合到每一個稱爲動作:

BindFilter<LogErrorsAttribute>(FilterScope.Last, 0); 

現在一切都完美而乾淨。

最後編輯:我注意到有人最近upvoted這一點,所以他們可能會用我找到了解決辦法。我在上次編輯中發現了一個解決方案的錯誤。看起來,我的導航控制器正在發射這個函數,導航開始的時候,沒有發生錯誤,寫入到filtercontext並在後面的行爲調用時停止了它的運行。爲了解決這個問題,我使用了下面的結合代碼:

kernel.BindFilter<LogErrorsAttribute>(FilterScope.Last, 0).When(
      (context, ad) => !string.IsNullOrEmpty(ad.ActionName) && ad.ControllerDescriptor.ControllerName.ToLower() != "navigation"); 

這停止了過濾器通過任何導航代碼(局部視圖從所述控制器被呈現)被解僱

+1

做一個IDisposable實現執行類的一些基本工作與我很不好。 – starskythehutch

+0

同意,但我努力尋找一個更合適的位置,保證函數將被調用。有時UI請求可能會通過服務層*檢查錯誤,但*無法回答。我曾嘗試在Global.asax中使用Application_EndRequest(),[注入]服務,但是這也不起作用。我接受建議。 –

+0

嗯,圍繞這一辦法是打電話的時候,應用程序錯誤是由控制器獲取的LogErrorsToDatabase()函數,那麼錯誤的收集中清除所有的域錯誤,所以如果在其他地方獲取的錯誤,同樣的錯誤不會記錄了兩次。 –

回答

4

是Ninject將配置在請求範圍中的對象。

+1

+1它通過在ASP.NET管道中添加一個鉤子來實現這個功能,當請求結束時,Dispose將所有對象作爲請求的作用域。您可以自己複製機制(查看Ninject源代碼),也可以將「IDisposable」提供給請求範圍內的一組對象,以根據您的喜好隱式執行此操作。 –

相關問題