39

我一直在尋找依賴注入並閱讀了一些文章。 但是我仍然無法找出MEF和其他IoC之間的區別。 所以,我的問題是:我應該在哪種情況下使用MEF或IoC容器?MEF和IoC容器之間的區別(如Unity,Autofac,SMap,Ninject,Windsor.Spring.net等)

爲什麼使用MEF for PRISM(WPF & Silverlight)或桌面應用程序很好?

鑑於在Web應用程序中,人們使用IoC容器。

那麼,決定使用哪種依賴關係技術的標準是什麼?

我已經通過文章http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx ,但我無法確定任何東西。

+1

有用的帖子:http://stackoverflow.com/questions/216565/why-exactly-isnt-mef-a-di-ioc-container – dugas 2013-03-22 14:08:07

+0

@duga爲鏈接的感謝,但仍然我想知道MEF可以使用已知類型或不使用以及爲什麼MEF用於Silverlight和WPF(MVVM模型),無論它們是否具有未知類型 – 2013-03-22 14:17:23

回答

35

最後我得出的結論對MEF VS IoC容器如下:

MEF最好當一個人有對付未知類型或基於插件架構使用。

IoC容器優選與已知類型一起使用。

此外,MEF爲依賴注入

鑑於建築溶液,IoC容器是用於依賴注入代碼級的解決方案。

IoC容器只是依賴注入技術,它填充類的實例,如果這些類的構造函數需要其他類的對象,則IoC還會注入所需的對象。但MEF不僅僅是依賴注入。儘管MEF也使用基於IoC的方法進行依賴注入,但MEF除了依賴注入之外還有許多其他功能。

MEF已經有兩個組成部分:

  1. 目錄:負責發現擴展

  2. 容器:提供了一個擴展加載到正在運行的 應用

的能力MEF不僅僅是依賴注入技術。它用於我們需要基於插件的體系結構用於我們的應用程序,但同時MEF使用基於IoC的方法進行依賴注入。

我期待更多的人對此發表評論。

+0

[Here](https://visualstudiomagazine.com/articles/ 2013/04/01/unity-vs-mef.aspx)是比較好的文章。作者最後的結論有點令人害怕 - 「壞消息是,在選擇一個後三個月,你會遇到一個問題,用其他工具更容易解決。 – RBT 2016-10-12 05:57:57

20

IoC是一種架構設計策略,MEF是設計模式依賴注入的實現。依賴注入(DI)通常是IoC的實施策略。通常使用術語IoC容器,這表明IoC是技術。

否,否則。 IoC是一個廣泛的概念,DI是實現IoC核心的設計模式。 MEF是DI的某種形式,但它並不具有IoC的所有基本特徵。

MEF使用組合來找出它需要解決的依賴關係。這很像其他IoC容器,比如Pico和Spring。但它停在那裏。我沒有看到任何生命週期管理或混合配置。後兩者我認爲是IoC(而不是DI)的基本部分,因爲調用者的性能不應該因被調用者使用的內存消耗而受到影響。

IoC原則是通過鬆散耦合它們給主叫方和被叫方的服務。這樣,兩種功能都可以進行優化。 MEF可能存在優化問題。例如,當你從菜單中調用一個數據庫時,在某個時候會調用數據庫。爲此,最好使用池化。 MEF無法做到這一點。

應用程序的類型應該獨立於設計模式的選擇。桌面或Web應用程序之間沒有太大的區別。兩者都是用戶界面,都應該能夠使用MEF和IoC。如果功能簡單並且不需要跨越優化邊界(如數據庫調用),那麼MEF是第一選擇,因爲它是使用.NET 4時存在的框架。然後它可能很有用,但如果調用穿越優化邊界(如解析或上傳文件),那麼使用IoC容器對於性能和維護來說更加富有成效。

信息我用: