新棱镜项目 - 使用MEF还是Unity?

时间:2010-10-26 05:33:41

标签: unity-container prism mef

我正在开始一个新的个人Prism 4项目。参考实现目前使用Unity。

我想知道我是否应该使用MEF,或者只是保持Unity。

我知道有一些讨论提到这两个是不同的,它们确实重叠,但是如果我一直选择Unity,我会错过吗?

3 个答案:

答案 0 :(得分:23)

同时查看the documentation

关键决策:选择依赖注入容器

  

Prism Library提供两种选择   对于依赖注入容器:   团结或MEF。棱镜是可扩展的,   从而允许其他容器   用一点点代替   工作。 Unity和MEF都提供了   相同的基本功能   依赖注入,即使它们   工作方式截然不同

两个容器提供的一些功能包括:

  • 他们都使用容器注册类型。
  • 他们都在容器中注册实例。
  • 他们都必须创建已注册类型的实例。
  • 他们都将已注册类型的实例注入构造函数。
  • 他们都将注册类型的实例注入属性。
  • 它们都具有用于标记需要管理的类型和依赖项的声明性属性。
  • 它们都解决了对象图中的依赖关系。

Unity提供了几个 MEF没有的能力:

  • 无需注册即可解决具体类型。
  • 它解决了开放式泛型。
  • 它使用拦截来捕获对象的调用并向目标对象添加其他功能。

MEF提供了几个 Unity没有的功能:

  • 它会在目录中发现程序集。
  • 它使用XAP文件下载和程序集发现。
  • 它会在发现新类型时重新组合属性和集合。
  • 自动导出派生类型。
  • 它与.NET Framework一起部署。

答案 1 :(得分:7)

我目前正在进行同样的调查。我上周参加了雷德蒙德的p& p研讨会。我有机会与一些p& p人聊天。

  

<强> MEF

     

+ .net的一部分,不需要额外的库

     

+在可扩展性,模块化方案方面非常强大

     

- 更通用的方法,对DI场景不太灵活

     

- 您需要使用属性进行装饰,您的代码将粘贴到MEF

     

Unity

     

+ DI场景非常灵活

     

+如果您坚持使用ctor注射并避免使用命名实例,那么您   不需要使用任何属性。最   您的系统不依赖于Unity

     

- 不支持可扩展性,模块化方案

     

- 需要部署第三方库

我认为一个好主意是使用MEF进行扩展(管理应用程序的模块,本地化注册)并使用Unity进行DI。

答案 2 :(得分:0)

嗯,这必须要明确MEF实现控制反转,但它不是它的一部分,所以这意味着它们不相同,有区别,当我们有静态依赖并且MEF提供时我们使用统一我们有动态依赖。

MEF还为我们提供了可扩展性,通过它我们可以引入端口类型机制,还可以指定可以通过该端口进行交互的组件类型。 可以从MSDN Document

了解更多信息