MEF、EntLib和Prism之间的区别

5
我有一个相对基础的问题,需要一些澄清。我一直在使用Prism(复合应用程序指南)来创建C#中的WPF MVVM桌面应用程序,这一点我非常清楚(或者我认为是这样),同时我也开始使用MEF,并意识到两者之间存在一种灰色地带(我已经找到并阅读了许多关于将MEF扩展程序集托管到IoC容器等方面的文章/博客)。
然而...最近我开始研究Enterprise Library 5,这就导致了我的困惑。它们如何彼此配合?所以Prism使用具有模块化架构的DI... EntLib使用具有应用程序块类型架构的DI...而MEF根本不使用DI?这是否意味着EntLib和Prism是完全分离的架构方法,还是其中一个是另一个的子集?MEF可以与任何一个或两个一起使用吗?
任何解释都将非常受欢迎。
谢谢。
2个回答

10

我也曾对IoC和MEF之间的区别感到困惑。我发现最简单的描述它们的方式是这样的:

MEF用于发现和实例化你不知道的东西。

而IoC用于请求已知的东西。

下面是一些背景信息。使用MEF时,你至少需要请求一次导入。你无法自己创建导入并将其放入目录中以供使用。MEF负责创建和满足导入。动态加载的DLL,其中你不知道哪些DLL会到达,就是一个很好的例子。

另一方面,使用IoC时- 你从当前库请求一个实现,并得到一个实现。但你也需要确保实现存在。

IoC用于依赖注入。MEF用于可扩展性。


嗨,乔希,非常感谢您的答复,这是一个描述和思考它们的好方法。我在 Channel 9 上找到了一段很棒的 Mike Taulty 视频,虽然是基于 Silverlight 的,但对于 WPF 也同样相关:http://channel9.msdn.com/blogs/matthijs/silverlight-4-a-guided-tour-of-the-managed-extensibility-framework-mef - jameschinnock
当使用DI正确完成时,IOC会公开接口,允许您“了解”功能但不是驱动它的类。这只是多态设计在起作用,但增加了复杂性。MEF独特之处在于它将使用反射动态生成DLL。因此,它允许在不更改其他代码库源代码的情况下替换DLL。因此,我完全同意Josh关于此组件的看法,但我不认为这对大多数人是合理的方法。http://msdn.microsoft.com/en-us/library/ff648478.aspx http://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx - Anthony Mason
MEF => 应用程序插件 - orad

3

请看这两篇文章:

至于Enterprise Library,在v5.0中,我们使其与容器无关。即使Enterprise Library默认提供Unity容器,它的架构也可以与您选择的任何容器或MEF一起使用。您需要提供一个合适的配置器(有关配置器的信息请参见此摘要的末尾)。


1
嗨,Grigori,感谢提供的链接,太好了!我是否正确地认为,Prism和EntLib之间的主要高级区别实际上是不同的程序架构方式吗?因此,Prsim使用模块-因此适合于WPF Ui dev,而EntLib使用App Blocks,可能更适用于服务器相关工作?什么情况下使用Entlib比Prism更好?再次感谢,非常感激。 - jameschinnock
James,这两个项目有不同的目标。Prism专注于构建复合UI(在WPF或Silverlight中),而EntLib是一个通用的(非特定层)库,用于解决常见的横切关注点,如日志记录、验证、异常管理等。 - Grigori Melnik
这种差异应该在某个地方有所突出,我想。 - nicolas
1
@jameschinnock 这是一个有用的链接,可以对比这些库:http://msdn.microsoft.com/en-us/practices/bb232643.aspx - nicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接