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容器对于性能和维护来说更加富有成效。

信息我用: