繁体   English   中英

如何在MEF中组成某个部分?

[英]How to Compose a certain part in MEF?

我有一个MEF扩展和一个组成其一部分的类库。 目前,我如何看待它的工作方式如下

_container.ComposeParts(obj);

上面将组成obj类成员内的所有属性部分。 我想执行以下操作(注意:以下代码仅用于说明目的,与MSDN中记录的CompositionContainer对象模型无关)

IMyCustomPart partObj = _container.ComposeACertainPart<IMyCustomPart>();

MEF允许吗?

您可以使用CompositionContainerGetExportXXXXX方法:

要获得一个零件:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM