我有一个 MEF 扩展和一个组成它一部分的类库。 目前我认为它的工作原理如下
_container.ComposeParts(obj);
上面将组成 obj 类的成员中的所有属性部分。我想做类似以下的事情(注意:以下代码仅用于演示目的,与 MSDN 中记录的 CompositionContainer 对象模型无关)
IMyCustomPart partObj = _container.ComposeACertainPart<IMyCustomPart>();
MEF 允许这样做吗?
最佳答案
您可以使用 CompositionContainer 的 GetExportXXXXX
方法:
获取单个零件:
var part = _container.GetExportedValue<IMyCustomPart>();
请注意,仅当只有一个导出部件时,此方法才有效。
导出零件序列(零个或多个):
var parts = _container.GetExportedValues<IMyCustomPart>();
如果您想避免抛出ImportCardinalityMismatchException,这是首选.
MEF 还支持延迟导出 (Lazy<>)。如果您希望以懒惰的方式创建零件,这些会非常方便。
但请注意,默认情况下 MEF 正在导出共享部件。这意味着在组合或调用 GetExportXXXX 期间仅创建并传递一个实例。要克服这个问题,您可以设置非共享 PartCreationPolicy :
[Export]
[PartCreationPolicy(CreationPolicy = CreationPolicy.NonShared)]
public class MyExportedClass { ... }
最后是ExportFactory如果您想创建非共享部分并自己处理它们的生命周期(在大多数其他情况下由容器完成),这会有所帮助。有关 ExportFactory 的介绍,请查看 ExportFactory in MEF 2 .
关于c# - 如何在MEF中编写某个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766063/