2017-10-19 157 views
0

我目前正在使用使用Ninject,Log4Net和Nancy的應用程序。使用Ninject,Log4Net和Nancy注入ILogger

我遇到的問題是確定將Web.config提供的Log4Net配置持久化到所有注入的ILogger實例的最佳方式。

一些背景:

在這個應用中,我們構建了一個單一的ninject StandardKernel,它會自動加載由Ninject.Extensions.Logging提供的Log4NetModule

我們南希引導程序類繼承使用this project

使用上述NinjectNancyBootstrapper方法,我們能夠成功解決以下屬性:

/// <summary> 
/// Injected Logger 
/// </summary> 
[Inject] 
public ILogger Logger { get; set; } 

這依賴於我們的Web.config中提供的Log4Net配置。

之前,爲了創建靜態StandardKernel的,我們正在執行的XmlConfigurator:

log4net.Config.XmlConfigurator.Configure(); 
_kernel = new StandardKernel(); 

從我的理解,這個配置應該只需要在應用程序調用一次(這固然可能是不正確),在創建任何ILogger實例之前。在開始我的應用程序時,注入的第一個ILogger實例擁有我期望的appedder。每一個後續的調用仍能成功解析依賴關係,但是缺少第一配置的appender。這裏是否有預期的行爲,XmlConfigurator只適用於創建的第一個ILogger?雖然這對於爲整個應用程序使用單個ILogger的情況下肯定會起作用,但我希望每個類型至少有一個。

我最初嘗試解決這個問題的一個方法是將XMLConfigurator附加到RequestStartup方法中,但是在我們的API調用中增加了相當多的開銷(幾乎使響應時間加倍)。

也許我正在接近這個問題完全錯誤,但我想知道是否有人對此問題有任何建議和/或解決方案。

謝謝。

回答

1

你只需要在Ninject 事情是這樣的註冊​​作爲單獨服務:

kernel.Bind<ILogger>.To<LoggerConstructor>().InSingletonScope(); 
+1

這是一個很好的建議,但在這種情況下,我希望能得到一個記錄器實例(1元或者鍵入或每個請求1,而不會導致XML加載開銷)。我最終能夠一次運行XML Load。看起來問題歸結爲每個請求產生的子容器。我添加了一些自定義邏輯,使我的nancy請求處理程序從父IoC容器中檢索日誌依賴項,並且它現在似乎具有所需的行爲 – Miek