MEF Global CompositionContainer在现有应用程序中

时间:2010-06-29 13:44:27

标签: .net mef composition

我正在研究MEF作为我们现有.NET应用程序中插件解析的解决方案。

在我能找到的所有示例中,主应用程序创建了CompositionContainer的一个实例并调用了container.ComposeParts(this)。

问题是,我的应用程序并非完全基于MEF构建,因此对象图中有一个没有MEF组件的漏洞。 所以我的对象层次结构可能如下所示:

  

应用程序(MEF容器) - >对象B   (没有MEF) - > ObjectA(需要MEF   进口)

在这个对象层次结构中,我不可能在应用程序上调用container.ComposeParts(this)并期望应用程序创建ObjectB并满足ObjectA的Imports。

在全局公开CompositionContainer是一个好习惯,这样我可以在以后的时间比在Application Startup上编写ObjectA,还是必须重构我的整个应用程序以支持线性MEF对象图?

1 个答案:

答案 0 :(得分:2)

  

暴露这个是一个好习惯   CompositionContainer全球

我不认为这是一个好的做法,但是当不可能在任何地方引入控制原理的反转时,这是一个合理的妥协。有时现有的代码库并不完全在您的控制之下,或者是.NET和本机代码(例如COM组件)的复杂混合,或者只是太大而无法重构。

在Silverlight中,XAML中对象的构造也不在MEF的控制之下,因此Microsoft引入了基本相同的解决方案:默认的MEF容器可以作为全局访问,并使用PartInitializer.SatisfyImports(this);调用。

请注意,遵循此模式会将全局的任何消费者与MEF以及用于公开它的全局变量紧密联系在一起。在其他应用程序中或与其他IoC容器一起使用此代码是不可能的。它还会使单元测试复杂化。