MEF与任何IoC

纵观微软的托pipe扩展性框架(MEF)和各种IoC容器(如Unity),我无法看出何时使用一种types的解决scheme。 更具体地说,似乎MEF处理大多数IoCtypes模式,并且像Unity这样的IoC容器不是必需的。

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

归结起来,主要区别在于IoC容器通常对于静态依赖(在编译时已知)是最有用的,而MEF通常在dynamic依赖(仅在运行时已知)时最为有用。

因此,它们都是组合引擎,但是每种模式的重点都不相同。 因此devise决定变化很大,因为MEF围绕未知部分的发现进行优化,而不是已知部分的注册。

这样想:如果你正在开发你的整个应用程序,一个IoC容器可能是最好的。 如果您正在编写可扩展性,那么第三方开发人员将扩展您的系统,MEF可能是最好的。

此外,@Pavel Nikolov的答案提供了一些很好的方向(由MEF的项目经理Glenn Block撰写)。

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

MEF擅长让你这样做。 通常情况下,IOC将确保您可以在未来的某个时间点为ORM产品2创build一个基于ORM产品1的IUserRepository。 但是,大多数IOC解决scheme都假定在给定的时间内只有一个IUserRepository有效。

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

作为一个例子,我们通过MEF插件来做我们的权限检查和我们的validation,为我一直在努力的一个大的web应用程序。 使用MEF,我们可以查看logging的CreatedOndate,并在创buildlogging时挖掘实际有效的validation插件,并通过该插件和当前有效的validation程序运行loggingBOTH,并比较logging的有效性时间。

这种function还可以让我们定义插件的覆盖覆盖。 我正在使用的应用程序实际上是为30多个实现部署的相同的代码库。 所以,我们通常会寻求插件,要求:

  1. 一个特定于当前站点的接口实现和特定的loggingtypes。
  2. 一个特定于当前站点的接口实现,但可以与任何types的logging一起使用。
  3. 适用于任何网站和任何logging的界面。

这可以让我们捆绑一系列默认插件,但只有在特定的实现没有用客户特定的规则覆盖它的情况下。

国际奥委会是一个伟大的技术,但似乎更容易编码到接口,而不是具体的实现。 但是,将这些实现交换出去更像是IOC中的一个项目转移类事件。 在MEF中,您可以灵活地使用接口和具体实现,并使其成为许多可用选项之间的运行时决策。

我为离题而道歉。 我只是想说,有2个缺陷使MEF成为不必要的复杂因素:

  • 这是基于属性的,对于帮助你弄清楚事情为什么如此起作用并没有什么好处。 没有办法去弄清楚框架内部的细节,看看到底发生了什么。 没有办法得到一个跟踪日志或连接到解决机制和手动处理未解决的情况

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

所以我对此非常失望。 我花了太多的时间与风车试图引导一些class级,而不是解决真正的问题。 我确信,当你完全控制VSdebugging器中创build的内容,时间和可以跟踪的内容时,没有比老派的dependency injection技术更好的了。 我希望有人主张MEF提出了一些很好的理由,为什么我会select平原DI。

我同意MEF可以是一个完全有能力的IoC框架。 实际上,我正在编写一个基于使用MEF的可扩展性和IoC的应用程序。 我把它的通用部分,并成为一个“框架”,并开放源代码作为自己的框架称为SoapBox核心 ,以防人们想看看它是如何工作的。

特别是,如果你想看到MEF的行动,看看主机是如何工作的。