MEF 和 IoC 容器(如 Unity、Autofac、SMap、Ninject、Windsor.Spring.net 等)之间的区别

Posted

技术标签:

【中文标题】MEF 和 IoC 容器(如 Unity、Autofac、SMap、Ninject、Windsor.Spring.net 等)之间的区别【英文标题】:Difference between MEF and IoC containers (like Unity, Autofac, SMap, Ninject, Windsor.Spring.net, etc.) 【发布时间】:2013-03-12 10:12:28 【问题描述】:

我一直在搜索依赖注入并阅读了几篇文章。 但我仍然无法找出 MEF 和其他 IoC 之间的区别。 所以,我的问题是:在哪种情况下我应该更喜欢使用 MEF 或 IoC 容器?

为什么将 MEF 与 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 的文章,但我无法确定任何事情。

【问题讨论】:

有用的帖子:***.com/questions/216565/… @duga 感谢您的链接,但我仍然想知道 MEF 是否可以使用已知类型以及为什么在 Silverlight 和 WPF(MVVM 模型)中使用 MEF,无论它们是否具有未知类型 【参考方案1】:

最终我对 MEF 与 IoC 容器的总结如下:

当必须处理未知类型或基于插件的架构时,首选使用 MEF。

IoC 容器优先用于已知类型。

此外,MEF 是依赖注入的架构解决方案

而 IoC 容器是依赖注入的代码级解决方案。

IoC 容器只是填充类实例的依赖注入技术,如果这些类的构造函数需要其他类的对象,那么 IoC 也会注入所需的对象。但 MEF 不仅仅是依赖注入。虽然,MEF 也使用基于 IoC 的方法进行依赖注入,但除了依赖注入之外,MEF 还做了很多其他事情。

MEF 有两个组件:

    目录:负责发现扩展

    容器:提供将扩展加载到正在运行的 应用

MEF 不仅仅是依赖注入技术。它用于我们的应用程序需要基于插件的架构,但同时 MEF 使用基于 IoC 的方法进行依赖注入。

我期待更多人对此发表评论。

【讨论】:

Here 是一篇关于此比较的好文章。作者最后的结论有点吓人-The bad news is, three months after picking one, you'll run into a problem that would've been easier to solve with the other tool.【参考方案2】:

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

我使用的信息:

Hanselminutes 148(Glenn Block 的播客采访)。

Managed Extensibility Framework (MEF) (MSDN)

Cutting Edge - Application Extensibility: MEF vs. IoC

Inversion of Control Containers and the Dependency Injection pattern

Inversion of control(***)

Why exactly isn't MEF a DI/IoC container?

【讨论】:

以上是关于MEF 和 IoC 容器(如 Unity、Autofac、SMap、Ninject、Windsor.Spring.net 等)之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF MVVM模式Prism框架从零搭建(经典)

IoC 容器,在编译时检查错误

C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

IOC之--MEF框架

IoC与DI,Unity的使用

C#/.NET IOC框架——Unity容器基础入门