MEF与任何IoC相比

Pur*_*ion 67 mef inversion-of-control unity-container

看看Microsoft的Managed Extensibility Framework(MEF)和各种IoC容器(例如Unity),我没有看到何时使用一种类型的解决方案而不是另一种.更具体地说,似乎MEF处理大多数IoC类型模式,并且像Unity那样的IoC容器不是必需的.

理想情况下,我希望看到一个很好的用例,其中将使用IoC容器代替MEF或者除了MEF之外.

Bry*_*tts 75

简化时,主要区别在于IoC容器通常对静态依赖性(在编译时已知)最有用,而MEF通常对动态依赖性最有用(仅在运行时知道).

因此,它们都是组合引擎,但每种模式的重点都非常不同.因此,设计决策变化很大,因为MEF围绕未知部件的发现进行了优化,而不是已知部件的注册.

以这种方式思考:如果您正在开发整个应用程序,那么IoC容器可能是最好的.如果您正在编写可扩展性,那么第三方开发人员将扩展您的系统,MEF可能是最好的.

此外,@ Pavel Nikolov的回答中的文章提供了一些很好的指导(它由MEF的项目经理Glenn Block撰写).

  • 这篇MSDN文章真的为我带来了点回家:http://msdn.microsoft.com/en-us/library/hh708870.aspx.对于熟悉IoC/ID的MEF新手,MEF似乎是注射(组合)......没有类型注册.所以,上面的SO答案确实为我带来了重点.现在听听关于这个话题的备受吹捧的Hanselman播客节目:http://www.hanselminutes.com/148/mef-managed-extensibility-framework-with-glenn-block (2认同)

J W*_*nia 26

我已经使用MEF一段时间了,当我们使用MEF代替IOC产品时,关键因素是我们经常在给定时间在我们的插件目录中有3-5个给定接口的实现.应该使用哪一个实现实际上只能在运行时决定.

MEF擅长让你做到这一点.通常情况下,IOC旨在确保您可以在未来的某个时刻换出基于ORM产品2的ORM产品1的IUserRepository.但是,大多数IOC解决方案都假设在给定时间只有一个IUserRepository生效.

但是,如果您需要根据给定页面请求的输入数据选择一个,则IOC容器通常处于亏损状态.

作为一个例子,我们通过MEF插件进行我们的权限检查和验证,这是我已经工作了一段时间的大型Web应用程序.使用MEF,我们可以查看记录的CreatedOn日期,然后挖掘创建记录时实际生效的验证插件,并通过该插件和当前生效的验证器运行记录并比较记录的有效性时间.

这种功能还允许我们定义插件的覆盖覆盖.我正在处理的应用程序实际上是为30多个实现部署的相同代码库.所以,我们通常会通过询问以下内容来寻找插件:

  1. 特定于当前站点和特定记录类型的接口实现.
  2. 一种特定于当前站点的接口实现,但适用于任何类型的记录.
  3. 适用于任何站点和任何记录的接口.

这让我们捆绑了一组将启动的默认插件,但前提是该特定实现不会使用客户特定规则覆盖它.

IOC是一项伟大的技术,但实际上似乎更多的是使代码更容易编码而不是具体的实现.但是,将这些实现交换出来更多的是IOC中的项目转移事件.在MEF中,您可以获得接口和具体实现的灵活性,并使其成为许多可用选项之间的运行时决策.


Tri*_*Gao 5

我因为偏离主题而道歉.我只想说有两个缺陷会导致MEF出现不必要的并发症:

  • 它是基于属性的,对帮助你弄清楚为什么事情像他们一样工作没有任何帮助.没有办法了解框架内部的细节,看看到底发生了什么.无法获取跟踪日志或连接到解析机制并手动处理未解决的情况

  • 它没有任何故障排除机制来找出某些部件被拒绝的原因.尽管指出了一个失败的部分,它并没有告诉你为什么那部分失败了.

所以我对它非常失望.我花了太多时间来争取风车试图引导几个班级,而不是解决真正的问题.当我完全控制创建的内容,何时以及可以跟踪VS调试器中的任何内容时,我确信没有比旧式依赖注入技术更好的了.我希望有人提倡MEF提出了一些很好的理由,为什么我会选择普通的DI.