文档中的示例有一个填充的计算器字段,该字段存在于调用
的同一对象上_container.ComposeParts(this);
我对ComposeParts()
方法有点困惑。我猜这不是你应该在导入值的所有对象的构造函数中调用的东西,那么在实例化对象时让MEF填充对象上的字段的正确方法是什么?
答案 0 :(得分:2)
不,你不需要在每个构造函数中调用ComposePart()。在组合MEF(运行时)期间,浏览所有目录并尝试将Imports与有效的Exports匹配。这一点肯定是一个问题 - 你必须让MEF实例化你的对象,你不要自己做(或告诉WPF / Silverlight这样做)。它通过您的项目和课程将所有内容连接起来。
如果有些类可以进行导入,但是你需要动态创建那些实例,那么你可以在类似构造函数的CompositionInitializer.SatisfyImports()中使用类似的东西。
但是如果你这样做,那么我认为推荐的做法是看一个不同的容器,比如Unity。
答案 1 :(得分:0)
如果您使用MEF在您的应用中实现DI,那么您应该牢记: 组合物应该只在组合物根中发生(优选)(参见Mark Seemann的文章:http://blog.ploeh.dk/2011/07/28/CompositionRoot/)。
任何尝试使用任何IoC容器在稍后的运行时间内显式解析所需的实例都是服务定位器的一种做法,它被认为是DI领域的反模式。