我應該使用哪個依賴注入工具?[關閉]
我正在考慮在我們的使用者界面中將 Microsoft Unity 用於我的依賴注入工具。
我們的中間層已經在使用 Castle Windsor,但我認為我應該堅持使用 Microsoft。
有人對最好的依賴注入工具有什麼想法嗎?
如果您的系統在設計時考慮了 IoC/DI,那麼堅持使用一個容器並不是很重要。通過正確的方法,您可以輕鬆地更改 IoC 庫。
當然,容器必須提供足夠的靈活性來支持常見的廣泛使用的場景(生命週期管理、適當的容器嵌套、XML 和程式碼配置、攔截、快速解析)。
我建議在 Castle(廣泛使用並且有很多集成庫)和 Autofac(輕量級、快速並且具有適當的容器嵌套,但不是那麼廣泛使用)之間進行選擇
Hanselman提供了一份 IoC 容器的完整列表
PS:你不想使用 Unity
最近增加了其中 6 種(Windsor、Unity、Spring.Net、Autofac、Ninject、StructureMap)的使用率,我可以提供一個快速總結,包括我們的選擇標準和最終選擇。
注意:我們沒有考慮 PicoContainer.Net,因為我們的團隊之一認為 .Net 埠與 Java 版本相比非常差。我們也沒有研究 ObjectBuilder,因為 Unity 是在 ObjectBuilder2 之上建構的,預設情況下被認為是更好的選擇。
首先,我可以說它們或多或少都非常相似,這真的歸結為最適合你的東西,以及你的具體要求。我們的要求包括:
要求
- 基於建構子的注入(我們不打算使用屬性、欄位或方法注入)
- 可程式配置(不是XML)
- 容器層次結構(每個應用程序、每個請求和每個會話一個,以更隱式地將組件生命週期範圍綁定到容器)
- 組件生命週期管理(用於更精細的範圍界定,例如瞬態/單例)
- 從介面注入到類型或具體實例(例如
ILogger -> typeof(FileLogger)或ILogger -> new FileLogger())- 用於預/後初始化的高級組件創建/“創建事件機制”
- 正確處理
IDisposable容器拆解上的組件- 有據可查和/或線上資訊隨時可用
注意:雖然性能是一項要求,但並未將其納入選擇因素,因為根據此基準,所有審查的容器似乎都相似
測試
每個容器都用於典型的 Asp.Net webforms 項目(因為這是我們的目標應用程序類型)。我們使用帶有單個簡單使用者控制項的單個簡單頁面,每個控制項分別繼承自一個基本頁面/基本控制項。我們在
BasePage“每個請求”範圍容器上使用了 1 個容器,在 global.asax 上使用 1 個容器作為“應用程序”範圍,並嘗試將它們連結在一起,以便可以從兩個容器中解決依賴關係。每個 Web 應用程序共享一組人為的域對象,模擬多層次的依賴關係、範圍類型(單例/瞬態)以及託管和非託管類(
IDisposable必需)。“頂級”依賴組件是從BasePage.結果
Windsor - 滿足所有標準,並擁有良好的案例歷史、部落格社區和線上文件。易於使用,可能是事實上的選擇。通過工廠設施創建高級組件。還允許連結單獨創建的容器。
Spring.Net - 冗長且無用的文件以及不明顯/易於可程式配置。不支持泛型。未選擇
Ninject - 易於使用,文件清晰。強大的功能集滿足了我們所有的要求,除了容器層次結構,所以很遺憾沒有選擇。
StructureMap - 文件很少,儘管有一個滿足我們所有要求的相當高級的功能集,但是沒有用於容器層次結構的內置機制,儘管可以使用 for 循環一起破解,請參見此處 lambda 表達式流式介面確實看起來有點過頭了起初很複雜,儘管可以封裝起來。
Unity - 有據可查,易於使用,符合我們所有的選擇標準,並且有一個簡單的擴展機制來添加我們需要的創建前/後創建事件機制。必須從父容器創建子容器。
Autofac - 有據可查且相對易於使用,儘管 lambda 表達式配置似乎有點過於復雜,但同樣可以輕鬆封裝。組件範圍是通過“標記”機制實現的,並且所有組件都使用建構器預先配置,這有點不方便。子容器是從父容器創建的,並從“標籤”分配組件。允許通用注入。
結論
我們最終的選擇是在 Windsor 和 Unity 之間,而這一次我們選擇了 Unity,因為它易於使用、文件、擴展系統以及處於“生產”狀態。