[英]How to Compose a certain part in MEF?
我有一个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的介绍,请参阅MEF 2中的ExportFactory 。
如何使用MEF ExportFactory ?
您可以这样做:
[Export]
public class YourClass {
[Import]
public ExportFactory<MyCustomPart> CustomPartExporter {get; set;}
public IMyCustomPart GetMyCustomPart() {
return CustomPartExporter.CreateExport().Value;
}
}
如果您的类型具有构造函数,则可以将ComposeExportedValue
方法与GetExport<T>
方法一起使用。 例如:
IMyCustomPart partObj = _container.ComposeExportedValue( _container.GetExport<IMyCustomPart>().Value );
免责声明:我还没有机会对此进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.