我一直在研究如何使用Castle Windsor將Log4Net ILog注入類。在大多數例子中,我看到溫莎城堡可以提供一個「促進者」,提供財產注入,並注入ILogger(而不是ILog)。我發現只有一個使用了構造器注入的例子,並且沒有使用輔助器方法(參見Castle Windsor dependency injection: Use the caller type as a parameter)爲什麼Log4Net中有命名記錄器?
在所有這些例子中,似乎Log4Net想要有一個命名記錄器。大多數例子都是指Log4Net靜態方法LogManager.GetLogger(這裏是類名)。這使得在不使用反射的情況下定義CastleWindsor的依賴性或輔助方法(可以使用輔助器方法用於ctor injection ???)是一個挑戰。當看到Ilya Kogan(上面的URL)的問題時,我想我不明白爲什麼我需要,或者甚至想要一個命名的記錄器。我無法在任何地方使用相同名稱的記錄器嗎?
例如,我不能只註冊硬編碼名稱爲XXX的記錄器? (它似乎工作正常,最後,我只是想記錄 - 我不在乎哪個記錄器記錄它...)是否有範圍問題?是否有內存泄漏問題?爲什麼不能/不應該記錄器是單身?
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<log4net.ILog>().UsingFactoryMethod(() => log4net.LogManager.GetLogger("xxx"))
);
}
UPDATE:
在一些研究中,硬編碼命名爲記錄器可以使用 - 如XXX在我的例子以上,但如果記錄器的配置的記錄器名稱輸出到日誌文件和如果記錄器名稱被動態分配爲與方法或類相同的名稱,則自動獲取引用記錄源自的位置。日誌文件中的上下文可能非常有用。
當專門針對構造函數注入,似乎有5點可能的選擇...
- 使用獨立的,並沒有使用命名記錄器(因而日誌文件未報道)
- 與男星注射使用反射
- 使用屬性注射(經由主持人)
- 使用後急劇AOP IL注射用於記錄
- 使用CTOR注射(通過促進者)(如在伊利亞安德高根的例子所示)
相關:http://stackoverflow.com/questions/9892137/windsor-pulling-transient-objects-from-the-container – Steven