Dot-Net

日誌記錄、面向方面的程式和依賴注入 - 試圖理解這一切

  • October 26, 2011

我知道日誌記錄是 AOP 的主要案例。此外,日誌包裝器也被舉例說明當您想要使用 DI 以便類不與特定的日誌記錄實現耦合時。但是,有些人認為記錄包裝器是一種反模式。首先,這種觀點是因為在大多數情況下,包裝器趨於簡單化,並刪除了日誌框架的許多特定功能。如果您實現了這些特定功能,為什麼不直接使用框架。

我知道Common.Logging外觀試圖為您抽象 log4Net、EntLib、NLog 的大量特性。然而,即使在這裡,我們仍然對 Common.Logging 有某種依賴。不是以關於介面等的程式碼/單元測試方式,但如果項目終止(自上次發布以來已經過去一年多),或者您想稍後切換到不支持的記錄器,這可能會導致問題。

也就是說,如果日誌記錄是通過 AOP 實現的,是否甚至有必要使用 DI 作為日誌記錄依賴項(即為什麼不直接引用說 NLog)?是的,程式碼的 AOP 部分將緊密耦合,但是想要進行單元測試的類的邏輯沒有日誌記錄依賴關係(至少在編織發生之前)。正是在這一點上,我有點迷茫(我還沒有嘗試過 AOP)。編織之後,如果沒有對 AOP 程式碼使用 DI,會不會導致對被測方法進行單元測試時出現問題?或者可以在不編織 AOP 程式碼的情況下進行單元測試嗎?

除非日誌記錄是軟體使用者的要求,否則我不確定使用模擬測試日誌記錄是否有用。我認為被測方法的業務邏輯是最感興趣的測試。最後,如果想使用 TDD/BDD,難道不是必須使用 DI 來實現 AOP 程式碼中的日誌依賴嗎?還是只是不試駕AOP 方面的東西?

正如您所看到的,我試圖了解最實用的方法是開發一個將 AOP 用於橫切關注點和 DI 用於設計/測試的應用程序。由於 AOP 相對較新,而日誌記錄是最常見的範例,那麼推薦的方法是什麼?

日誌記錄不是一項服務,它是一個橫切關注點。因此,最好使用Decorator來實現。但是,添加大量裝飾器只是為了啟用各種不同服務的日誌記錄往往會違反DRY,在這種情況下,您可以進一步將這些裝飾器演變成單個攔截器。

雖然您可以使用 IL weaving 來實現 AOP,但更好的選擇是使用支持動態攔截的 DI Container,因為它是一種更輕量級的解決方案。

這使您能夠將具體服務與日誌記錄完全分離。在這種情況下,我會說沒有理由包裝任何特定的日誌框架,因為如果您想更改日誌框架,您可以只更改單個攔截器。

這是一個討論用於檢測的裝飾器和攔截器的範例(非常類似於日誌記錄)。

如果您想了解更多關於 AOP 和 DI 的資訊,您可以線上查看我在 GOTO Copenhagen 2010 上的演講

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