2012-02-25 65 views
7

可能重複:
How do the major C# DI/IoC frameworks compare?如何選擇DI容器?

有這麼多DI容器,我覺得有點迷失。我是DI模式的新手。

我正在閱讀Dependency Injection in .NET這本書,我發現DI在改善代碼基礎方面非常有用,使它更加鬆散耦合並且更具可測試性。

我現在想爲我的虛擬項目引入一個DI容器,但這裏有太多的選擇。

我應該如何在Castle Windsor,Unity,StructureMap,Spring.NET,Autofac,Ninject,Funq,LinFu等之間進行選擇?

我想一個連貫的做法是「只挑一個」並開始使用它(因爲我認爲它們非常容易互換,特別是在早期階段),但我想做出更明智的決定。

+0

不管你做什麼,都不要選擇Funq,因爲它不支持自動構造函數注入,它基本上不允許它在任何實際項目中使用,或者實際上使它不能作爲真正的DI容器使用。 – Steven 2012-02-25 02:07:46

回答

5

這就像買車。你可能會喜歡豐田,但它只有2.5L發動機。你可能會喜歡法拉利,但它太紅了。你可能會喜歡馬自達,但你的老闆不允許你駕駛它。你可能會喜歡悍馬,但是你的同事會嘲笑你。將製造商與您的口味混合在一起,對於某個人或某個不同的時刻總會缺少某些東西。

我認爲 - 首先,DI通常比沒有DI更好。選擇任何東西,你會變得更好。我會選擇一些:

  • 具有良好的支持,社區(這樣你就可以得到答案)
  • 背後都有一個好靠山公司(所以你沒有得到,當它倒閉重寫代碼)
  • 感覺很好,你(這樣你就不會在孩子,不太爽)前宣誓
  • 是不是該項目
  • 不僅僅是DI矯枉過正,但提供的東西的生態系統,將減少你花在你知道你可以做的任務上的時間,而不是現在 - 然後你可以專注於重要的事情
  • 被許多人使用(所以你知道很多零件也在現實生活中被測試並且錯誤被填充)
  • 不是5歲(例如那個文檔說它支持Windows 98或其他東西)

我的2美分 - http://www.springframework.net/。我的意思是,他們的documentation contents page就像20頁長...

,或者你可能需要一些更答案看一個類似的問題:

2

您可以從MVC3中的內置DependencyResolver開始。稍後,您可以輕鬆升級到Enterprise Library Unity DI。

Brad Wilson在How to use DI in MVC3上提到了一系列帖子。

-5

for .NET的最發達的DI容器Managed Extensibility Framework (MEF)我強烈建議使用它。 MEF在整個團隊中快速,輕鬆和可維護,並具有完美的學習曲線。

+6

*「用於.NET的最開發的DI容器是MEF」* - 這個覆蓋聲明肯定不是真的 – BrokenGlass 2012-02-25 01:26:22

+0

我剛剛分享了我的經驗,之前我已經使用了一堆DI解決方案。 Nevermind ... – ogggre 2012-02-25 01:28:07

+3

MEF不是DI容器。 MEF在基本實現的頂部提供即插即用配置(顧名思義它是一個可擴展性框架而不是DI) – Manas 2012-02-25 01:36:10

0

我的立場是,看看幾個 - 你已經得到了很好的「.NET依賴注入」書籍(對於這個列表,我將添加Ninject,這不幸在本書中沒有涉及) - 並選擇其中一個你瞭解最好的和喜歡的語法。要開始使用高級功能並不重要,只是您開始

一旦你有一個IoC容器,替換它應該是微不足道的,因爲所有的改變都將在一個地方 - 聚合根 - 並且不會遍佈在你的代碼庫中。如果您還沒有使用IoC容器,也會強制您設計依賴注入,這將對您的項目產生更大的影響。

0

我一直在使用Ninject和Unity。將Unity MVC添加到Unity時,代碼會讓我想起Ninject代碼。

兩者都很容易實現。兩者都允許以配置文件爲中心來替換啓動器類中心。

我建議創建一個2小時的項目,並在每個ioc di框架中實現它,並根據經驗決定你喜歡哪一個。但是,如果您在不查看其他功能的情況下執行此操作,則可能發現錯過了某些內容。所以請看看第三方支持等優秀功能。

0

除了其他很棒的評論 - 如果你安裝Unity.MVC3軟件包,只要注意你必須使用HierarchicalLifetimeManager,如果你希望你的對象與每個請求一起處理。它的工作很好,但我想你會發現在大多數情況下,所有主要的都很好。

你的問題是找到一個適合你的環境的問題。有些地方允許開放源代碼,有些則不會,在這種情況下,Unity會勝出。