Dot-Net
如果使用日誌門面,在使用 IoC/DI 時是否應該注入日誌基礎設施?
我正在使用 Autofac 作為我的 IoC,並且從我讀過的關於 DI 主題的所有內容中都可以看出如何使用“建構子注入”來顯式公開類依賴項……但是,我也在使用 Log4Net 的日誌外觀(Common.Logging)並創建了Autofac 模組來注入它。現在,在我想做一些日誌記錄的每個類中,我都有額外的建構子參數(參見範例 #1)….
我想知道在使用日誌記錄外觀時是否需要記錄 DI?我知道通過建構子簽名顯式暴露依賴項是一個很好的架構。 但在記錄外觀的情況下,我相信以下是正確的:
- 我仍然可以隨時“換掉”日誌框架
- 恕我直言,該類並不真正依賴於 Logger。如果未配置日誌記錄,則使用 NullLogger。這幾乎是“如果你需要它就可以”與“除非你提供它否則它將無法工作”的交易……(參見範例#2)
那麼,其他人怎麼看?注入日誌外觀是不是矯枉過正?關於這個主題有一些類似的問題,但更籠統地說(基礎設施) - 我主要對日誌記錄感興趣……
// IoC "way" public class MyController : BaseController { private readonly ILog _logger; public MyController(ILog logger) { _logger = logger; } public IList<Customers> Get() { _logger.Debug("I am injected via constructor using some IoC!"); } } // just use the logger "way" public class MyController : BaseController { private static readonly ILog Logger = LogManager.GetCurrentClassLogger(); public IList<Customers> Get() { Logger.Debug("Done! I can use it!"); } }
日誌記錄只是基礎設施。注入它是矯枉過正的。我個人甚至不使用抽象層。我使用庫直接提供的靜態類。我的動機是我不太可能在目前項目中切換日誌庫(但可能會切換到下一個項目)。
但是,您在範例中使用了控制器。為什麼需要登錄它們?控制器只是視圖和模型(業務邏輯)之間的適配器。應該不需要登錄。
您通常只登錄包含業務邏輯的類,並且在頂層能夠記錄未處理的異常。這些是很難調試的情況,因此是需要記錄的地方。
必須在其他地方登錄表明您需要重構以正確封裝您的業務邏輯。