46

我一直在搜索依赖注入并阅读了几篇文章。但我仍然无法找出 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 ,但我无法确定任何事情。

4

2 回答 2

41

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

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

IoC 容器最好与已知类型一起使用。

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

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

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

MEF 有两个组件:

  1. 目录:负责发现扩展

  2. 容器:提供将扩展加载到正在运行的应用程序的能力

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

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

于 2013-03-25T08:29:34.707 回答
27

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

我使用的信息:

于 2013-05-27T01:22:57.577 回答