在我正在處理的應用程序中,我創建了一個輕量級記錄器,它有兩個用途。使用枚舉「域」記錄的錯誤將記錄到數據庫中,而使用枚舉「應用程序」記錄的錯誤可以從服務中提取並顯示給用戶。使用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");
這停止了過濾器通過任何導航代碼(局部視圖從所述控制器被呈現)被解僱
做一個IDisposable實現執行類的一些基本工作與我很不好。 – starskythehutch
同意,但我努力尋找一個更合適的位置,保證函數將被調用。有時UI請求可能會通過服務層*檢查錯誤,但*無法回答。我曾嘗試在Global.asax中使用Application_EndRequest(),[注入]服務,但是這也不起作用。我接受建議。 –
嗯,圍繞這一辦法是打電話的時候,應用程序錯誤是由控制器獲取的LogErrorsToDatabase()函數,那麼錯誤的收集中清除所有的域錯誤,所以如果在其他地方獲取的錯誤,同樣的錯誤不會記錄了兩次。 –