Dot-Net

如果使用日誌門面,在使用 IoC/DI 時是否應該注入日誌基礎設施?

  • September 25, 2012

我正在使用 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!");
   }
}

日誌記錄只是基礎設施。注入它是矯枉過正的。我個人甚至不使用抽象層。我使用庫直接提供的靜態類。我的動機是我不太可能在目前項目中切換日誌庫(但可能會切換到下一個項目)。

但是,您在範例中使用了控制器。為什麼需要登錄它們?控制器只是視圖和模型(業務邏輯)之間的適配器。應該不需要登錄。

您通常只登錄包含業務邏輯的類,並且在頂層能夠記錄未處理的異常。這些是很難調試的情況,因此是需要記錄的地方。

必須在其他地方登錄表明您需要重構以正確封裝您的業務邏輯。

引用自:https://stackoverflow.com/questions/12591955