0

文档中的示例填充了一个计算器字段,该字段存在于正在调用的同一对象上

_container.ComposeParts(this);

不过,我对这种ComposeParts()方法有点困惑。我猜这不是你应该在所有导入值的对象的构造函数中调用的东西,那么在实例化对象时让 MEF 填充对象字段的正确方法是什么?

4

2 回答 2

2

不,您不需要在每个构造函数中调用 ComposePart()。在合成 MEF 期间(在运行时),遍历所有目录并尝试将 Imports 与有效的 Exports 匹配。这绝对是一个陷阱——你必须让 MEF 实例化你的对象,你不要自己做(或告诉 WPF/Silverlight 去做)。它通过您的项目和类级联,将所有内容连接起来。

如果有些类确实有导入,但您需要动态创建它们的实例,那么您可以在构造函数中使用类似的东西——比如 CompositionInitializer.SatisfyImports()。

但如果你这样做,那么我认为推荐的做法是查看不同的容器,比如 Unity。

于 2013-02-04T21:41:25.963 回答
0

如果您使用 MEF 在您的应用程序中实现 DI,那么您应该记住:组合应该只发生(最好)在组合根中(阅读 Mark Seemann 的文章:http ://blog.ploeh.dk/2011/07 /28/CompositionRoot/)。

任何尝试使用任何 IoC 容器在稍后的运行时显式解析所需实例都是服务定位器的实践,这在 DI 世界中被视为反模式。

于 2013-05-23T11:34:29.537 回答