我目前正在使用使用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元或者鍵入或每個請求1,而不會導致XML加載開銷)。我最終能夠一次運行XML Load。看起來問題歸結爲每個請求產生的子容器。我添加了一些自定義邏輯,使我的nancy請求處理程序從父IoC容器中檢索日誌依賴項,並且它現在似乎具有所需的行爲 – Miek