MEF是服务定位器吗?

时间:2012-06-22 00:57:12

标签: mef anti-patterns service-locator

我正在尝试使用Caliburn Micro和nHibernate为新的LOB MVVM项目设计架构,现在我正在研究DI和IOC。

许多用于自举Caliburn Micro的示例使用MEF作为DI \ IOC机制。

我正在努力的是,MEF似乎相当受欢迎,但是Mef [Imports]注释的想法让我闻到了另一种服务定位器的味道?

我是否遗漏了一些关于MEF的内容,我所看到的几乎所有示例都没有正确使用它,或者我完全没有理解它是如何使用的,因为它会影响整个服务定位器的问题?

2 个答案:

答案 0 :(得分:3)

MEF本身不是服务定位器。它可用于实现服务定位器(Silverlight版本中的CompositionInitializer实际上是MEF中内置的服务定位器),但它也可以直接执行依赖注入。

虽然属性可能会“闻到”你,但它们本身并不会导致它成为服务定位器,因为你可以在创建时使用[ImportingConstructor]来注入数据。

请注意,这些属性实际上并不是使用MEF的唯一方式 - 它也可以通过direct registrationconvention based registration代替(CodePlex drop和.NET 4.5支持)。

答案 1 :(得分:1)

我想如果您只是new部署了具有属性导入的部分并尝试使用它们,那么您可能会遇到此处描述的一些相同问题:Service Locator is an Anti-Pattern

但实际上,您从容器中获取零件,如果您使用[Import]而没有额外的allowDefault属性,那么该零件是必需的,如果您要求,容器会炸毁您进行导入的部分。它会在运行时爆炸,是的,但与磨机服务定位器的运行不同,使用测试框架对MEF容器进行静态分析相当简单。我已经写了好几次herehere

在实践中,这对我来说不是问题,原因有两个:

  1. 我从容器中取出零件。
  2. 我使用构图测试。
  3. 我正在编写应用程序,而不是框架代码。