2010-03-10 18 views

回答

4

那么,通常情况下,在MEF中,您允许MEF执行对象构造,这将允许它自动正确地组合对象,并使用[Import]标签自动设置ILogger属性。

这就是说,这并不总是适用于每种情况。如果你不能让MEF构造你的对象,因为它们是从一个单独的源生成的,还有其他选项。

例如,这个常见问题发生在WPF和Silverlight中。当你使用这些技术时,你通常希望允许XAML解析器构造你的对象,但在这种情况下,它们将永远不会组成。

Silverlight 4正在添加CompositionInitializer类来处理这种情况。这是什么让你做的只是添加到您的构造函数:

public MyClass() // MyClass Constructor 
{ 
    CompositionInitializer.SatisfyImports(this); 
} 

而且CompositionInitializer将使用名为CompositionHost来组成构造的对象的静态类中定义的目录。这听起来像它可能是一个很好的选择在你的情况,以及...

现在,这是没有一个“官方”桌面版本。 Glenn Block在他的SkyDrive上发布了一张older port of this for desktop usage(名为PartInitializer,这是一个旧名字),效果相当不错。将当前的SL版本移植到桌面应用程序中非常容易,但这需要手动移植。

话虽这么说,有人说(在Twitter和其他地方)是CompositionInitializer桌面使用将被添加到MEF名为CodePlex的网站很快...

+0

感谢您的信息。我一直在遇到编码DataTemplateSelector的相同问题,并认为我可能不得不恢复到通过静态属性传递需要的特定上下文。这样更清洁。 – 2010-03-10 23:44:07

+0

我想要的是普遍构成应用程序域内的所有导入导出,而不必在每个类中编写依赖关系。这对于MEF是否可行? – TrustyCoder 2010-03-11 19:36:09

+0

@nitroxn:不,不是。导出处理得很好,但对于导入,您必须显式组合对象 - 这提供了一个干净的解决方法,允许对象自行组合,但需要在对象(即导入)的构造函数中添加一行。 – 2010-03-11 19:53:50