我们应该在哪种情况下使用哪种?如何决定选择哪一个?在什么情况下我们会选择同时使用它们?
我以前曾使用Unity Container(unity-container)。
答案 0 :(得分:12)
棘手的问题 - 因为两者确实在一定程度上重叠。
我会这样说:
使用任何有用的IoC,如果您主要关注依赖注入,以便将组件分离,例如:能够注入模拟而不是(用于测试)
使用MEF,尤其是如果您更容易进行扩展,例如能够“从导出某个界面的目录加载所有程序集”,如果您需要可扩展并为第三方打开(如Visual Studio:提供公共API,以便其他人可以为您的应用程序编写扩展名)。这是MEF真正闪耀的地方
对于MEF和Unity,还有MEF and Unity Integration Layer将两种工具的优势结合在一起。
我还建议你查看Ayende的excellent blog post,了解MEF与IoC的区别。
答案 1 :(得分:1)
当你有第三方编写插件,实现接口并希望能够在不破坏你无法重新编译的第三方插件的情况下对你的界面进行版本化时,MEF会发光。换句话说,MEF比原始IoC更复杂。
所以我会说IoC如果所有内容都编译为同一个构建系统的一部分,那么MEF如果你需要处理加载项就不能自己重新编译。
答案 2 :(得分:1)
Glen Block(MEF的前产品经理)在他的博客上已经很好地介绍了这一点:
答案 3 :(得分:0)
我听到了很好的解释(向作者道歉,我忘记了它是谁):在很高的层面上,当你想要一个给定界面的东西时,IoC是好的,MEF对你来说很有用想要来自给定界面的所有东西。
例如,在IoC中,您希望为接口返回特定的单个具体类:
For<ICarFactory>().Use<CarFactory>();
每当您想使用ICanFactory
时,您都会获得CarFactory
。
MEF很适合说给我所有的汽车工厂:
CheapCarFactory : ICarFactory
FamilyCarFactory : ICarFactory
LuxuryCarFactory : ICarFactory
等