我正在尝试使用Caliburn Micro和nHibernate为新的LOB MVVM项目设计架构,现在我正在研究DI和IOC。
许多用于自举Caliburn Micro的示例使用MEF作为DI \ IOC机制。
我正在努力的是,MEF似乎相当受欢迎,但是Mef [Imports]注释的想法让我闻到了另一种服务定位器的味道?
我是否遗漏了一些关于MEF的内容,我所看到的几乎所有示例都没有正确使用它,或者我完全没有理解它是如何使用的,因为它会影响整个服务定位器的问题?
答案 0 :(得分:3)
MEF本身不是服务定位器。它可用于实现服务定位器(Silverlight版本中的CompositionInitializer实际上是MEF中内置的服务定位器),但它也可以直接执行依赖注入。
虽然属性可能会“闻到”你,但它们本身并不会导致它成为服务定位器,因为你可以在创建时使用[ImportingConstructor]
来注入数据。
请注意,这些属性实际上并不是使用MEF的唯一方式 - 它也可以通过direct registration或convention based registration代替(CodePlex drop和.NET 4.5支持)。
答案 1 :(得分:1)
我想如果您只是new
部署了具有属性导入的部分并尝试使用它们,那么您可能会遇到此处描述的一些相同问题:Service Locator is an Anti-Pattern
但实际上,您从容器中获取零件,如果您使用[Import]
而没有额外的allowDefault
属性,那么该零件是必需的,如果您要求,容器会炸毁您进行导入的部分。它会在运行时爆炸,是的,但与磨机服务定位器的运行不同,使用测试框架对MEF容器进行静态分析相当简单。我已经写了好几次here和here。
在实践中,这对我来说不是问题,原因有两个: