我有一个MEF扩展和一个组成它的部分的类库。 目前我认为它的工作方式如下
_container.ComposeParts(obj);
以上将构成obj类成员内的所有属性部分。我想做类似以下的事情(注意:以下代码仅用于演示目的,与MSDN中记录的CompositionContainer对象模型无关)
IMyCustomPart partObj = _container.ComposeACertainPart<IMyCustomPart>();
MEF允许吗?
答案 0 :(得分:2)
您可以使用CompositionContainer的GetExportXXXXX
方法:
获得单个部分:
var part = _container.GetExportedValue<IMyCustomPart>();
请注意,仅当只有一个导出部件时,这才有效。
导出零件序列(零个或多个):
var parts = _container.GetExportedValues<IMyCustomPart>();
如果您想避免抛出ImportCardinalityMismatchException,则首选。
MEF还支持延迟导出(Lazy&lt;&gt;)。如果您希望以懒惰的方式创建零件,这些非常方便。
但请注意,默认情况下,MEF会导出共享部分。这意味着在组合或调用GetExportXXXX期间只创建并传递了一个实例。要解决此问题,您可以设置非共享PartCreationPolicy:
[Export]
[PartCreationPolicy(CreationPolicy = CreationPolicy.NonShared)]
public class MyExportedClass { ... }
最后有ExportFactory如果你想创建非共享部分并自己处理它们的生命周期(在大多数其他情况下由容器完成),它可以提供帮助。有关ExportFactory的介绍,请查看ExportFactory in MEF 2。
答案 1 :(得分:1)
如何使用MEF ExportFactory?
你可以这样做:
[Export]
public class YourClass {
[Import]
public ExportFactory<MyCustomPart> CustomPartExporter {get; set;}
public IMyCustomPart GetMyCustomPart() {
return CustomPartExporter.CreateExport().Value;
}
}
答案 2 :(得分:0)
如果您的类型具有构造函数,则可以使用ComposeExportedValue
方法和GetExport<T>
方法。例如:
IMyCustomPart partObj = _container.ComposeExportedValue( _container.GetExport<IMyCustomPart>().Value );
免责声明:我没有机会对此进行测试。