MEF和IoC容器的区别(如Unity,Autofac,SMap,Ninject,Windsor.Spring.net等)
我一直在寻找dependency injection并阅读一些文章。 但是我仍然无法找出MEF与其他IoC之间的区别。 所以,我的问题是这样的:我应该在哪种情况下使用MEF或IoC容器?
为什么在(WPF&Silverlight)或桌面应用程序中使用MEF for PRISM?
而在Web应用程序中,人们使用IoC容器。
那么,决定使用哪种依赖技术的标准是什么呢?
我已经通过文章http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx ,但我无法确定任何东西。
最终我所得出的有关MEF vs IoC容器的结论如下:
当需要处理未知types或基于插件的体系结构时,首选使用MEF。
IoC容器优选与已知types一起使用。
而且,MEF是dependency injection的体系结构解决scheme
而IoC容器是dependency injection的代码级解决scheme。
IoC容器只是dependency injection技术来填充类的实例,如果这些类的构造函数需要其他类的对象,那么IoC也会注入所需的对象。 但MEF不仅仅是dependency injection。 虽然MEF也使用基于IoC的方法进行dependency injection,但MEF除了dependency injection之外还有很多其他的东西。
MEF有两个组成部分:
-
目录:负责发现扩展
-
容器:提供将扩展加载到正在运行的应用程序的function
MEF不仅仅是dependency injection技术。 在我们的应用中,我们需要一个基于插件的体系结构,但同时MEF使用基于IoC的方法进行dependency injection。
我期待更多的人对此发表评论。
IoC是一种架构devise策略,MEF是devise模式dependency injection的实现。 dependency injection(DI)通常是IoC的实施策略。 通常使用术语IoC容器,这表明IoC是技术。
不,这是其他情况。 IoC是一个广泛的概念,DI是实现IoC核心的devise模式。 MEF是DI的一种forms,但它并不具有IoC的所有基本特征。
MEF使用组合来找出需要解决的依赖关系。 这很像其他IoC容器,比如Pico和Spring 。 但它停在那里。 我没有看到任何生命周期pipe理,也没有汇集configuration。 后两者我认为是IoC(而不是DI)的一个基本部分,因为调用者的性能不应该由于被调用者使用的内存消耗而受到影响。
IoC原则是松散地耦合它们给呼叫者和被呼叫者的服务。 这样,两种function都可以进行优化。 MEF可能存在优化问题。 例如,当你从菜单中调用一个数据库时,有时候会调用数据库。 这是最好的使用池。 MEF不能做到这一点。
应用程序的types应该独立于devise模式的select。 桌面或Web应用程序之间没有太大的区别。 两者都是用户界面,都应该能够使用MEF和IoC。 如果function简单,不需要跨越优化边界(如数据库调用),那么MEF是首选,因为它是使用.NET 4时存在的一个框架。那么它可能是有用的,但如果一个调用穿越优化边界(如文件的parsing或上传),那么使用IoC容器对于性能和维护来说更加有效。
我使用的信息:
-
Hanselminutes 148 (与Glenn Block的播客采访)。
-
托pipe扩展性框架(MEF) (MSDN)
-
尖端 – 应用程序可扩展性:MEF与IoC
-
控制容器的反转和dependency injection模式
-
控制反转 (维基百科)
-
为什么MEF不是DI / IoC容器?