2012-11-14 74 views
3

我一直在研究如何使用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注射(通過促進者)(如在伊利亞安德高根的例子所示)
+0

相關:http://stackoverflow.com/questions/9892137/windsor-pulling-transient-objects-from-the-container – Steven

回答

4

使用Castle Windsor對DI Log4Net Log進行DI的推薦方法是使用設施。一個已經爲Log4Net創建,其使用在this tutorial中演示。

+0

是的,如果我正確讀了這個例子,它會執行屬性注入,而不是注入。你知道輔導員是否支持ctor注射嗎? – barrypicker

+0

我上次檢查它也會允許構造函數注入。 –

+0

好的,在遵循本教程(刪除log4net,而不是添加在castle.windsor-log4net中)我現在收到一個錯誤無法創建組件'XYZ',因爲它具有依賴性得到滿足。 'XYZ'正在等待下列依賴項:未註冊的Service'log4net.ILog'。 – barrypicker

4

好問題。

簡而言之,log4net需要命名的記錄器,因爲這些名稱用於過濾日誌輸出(有關詳細信息,請參閱log4net文檔)。類型名稱只是一個方便的約定,因爲它提供了額外的上下文位,並且正確使用了名稱空間,可以讓您執行諸如「將所有NHibernate消息記錄到單獨的文件」之類的東西。

這也是爲什麼通常,如果你'不使用容器,你的類中有一個靜態的記錄器屬性/字段。

您所指的​​是Castle over logging的抽象,其中之一可以用於log4net。

儘管LoggingFacility提供了對​​提供依賴關係的開箱即用支持,但絕不會強迫您這樣做。

ILog登記的,應當如下(我從記憶寫這篇所以細節可能會略有不同)被改寫:

Component.For<log4net.ILog>() 
    .UsingFactoryMethod((k, c) => log4net.LogManager.GetLogger(c.RequestedType)) 
    .LifestyleTransient() 

c.RequestedType會給你,你要滿足的依賴類型和使其瞬變將避免所有類型都會重用記錄器的單個實例(無論第一種類型請求依賴關係)的問題。

+0

嗨Krzysztof,感謝您的答覆。發佈後,我意識到有一個問題 - 1)爲什麼使用命名記錄器(答案= log4net配置佈局定義「log4net.Layout.PatternLayout」可以指定%記錄器顯示在日誌文件中),以及2)如何動態地派生名稱,使得名稱與它所注入的類相同。使用你的建議似乎總是創建一個命名記錄器 - 名爲「log4net.ILog」。我的XXX硬編碼命名記錄器的例子幾乎是相同的結果。這是你的預期,或者我錯誤地使用了你的例子? – barrypicker

+0

hmm,參數'c'的一個屬性應該給你'ILog'的父類型,這就是我所指的那個。 –

+0

我試圖得到一個AAA類型的記錄器注入,但我沒有找到它。 我設法只找到類別爲AAA的包含引用的類BBB。 –

相關問題