簡體   English   中英

C#:ILogger與靜態日志實例

[英]C#: ILogger vs static Log instance

這是一個體系結構上的問題:您使用ILogger(並通過DI將其傳遞到構造函數中)還是更喜歡靜態類Log?

我們經常使用ILogger,但實際上似乎使代碼更加混亂,尤其是在通過構造函數傳遞代碼時。 如果沒有通過構造函數傳遞並且只是每次創建,那么我真的看不到使用接口的好處。

那么您如何處理呢? 我對它背后的論點特別感興趣-不僅僅是說“靜態”或“接口”。

謝謝

如果ILogger確實是一個跨領域的問題,並且在每個地方都在使用,從而導致使用新的構造函數參數來污染每個實例,那么您需要的是使用一種稱為AmbientContext的特殊方式的依賴項注入。

基本上,它為您提供了單例Context屬性,可以從業務范圍中的任何位置訪問該屬性,並且包含“全局”依賴項,例如日志記錄,時間服務等,無論您需要什么。

但是請注意,這並不意味着您可以扔掉ILogger並使用帶有硬編碼實現的靜態Log類。 環境上下文也是依賴項注入的一種方式,因此應解決其依賴項。

出於各種原因,根據您的用例,使用任何事物的靜態實例都是一個壞主意。
-在單元測試中很難模擬它們,因此即使不需要它們,記錄器也總是在寫日志。
-缺乏模擬還意味着您無法編寫測試以確保在適當情況下編寫了錯誤日志。 -無法在運行時替換它們,以允許注入不同的記錄器。 如果要發布庫供他人使用,這可能很重要。 我定義了一個標准的記錄器界面,並記錄了所有內容,然后允許客戶注入自己的記錄器,只要它實現了我的界面即可。
-如果使用供應商提供的默認靜態日志實現,則您將被鎖定在其界面中,這意味着您無法隱藏或更改記錄器的表面積。 如果新記錄器的語法發生更改,則更改記錄器將變得更加費勁。

這樣就可以進行某種注射。 我個人更喜歡在構造函數中具有所有依賴關系,即使它變得冗長,因為很容易看到特定類具有的所有依賴關系。 如果您要避免使用大型構造函數,則可以研究屬性注入。 這需要在類的屬性上具有屬性,但仍具有注入依賴項的所有優點。 如果將注入的屬性放在基類上,則它將自動供所有子級使用。

順便說一句,我不喜歡上述環境上下文,因為它基本上是一個單一用途的DI容器,並且您必須對多個環境服務容器有具體的引用。 如果可以輕松訪問此模式,請考慮“服務位置”,它是相同的想法,但更靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM