如何撰写MEF中的某个部分?

时间:2014-02-13 21:39:34

标签: c# mef

我有一个MEF扩展和一个组成它的部分的类库。 目前我认为它的工作方式如下

_container.ComposeParts(obj);

以上将构成obj类成员内的所有属性部分。我想做类似以下的事情(注意:以下代码仅用于演示目的,与MSDN中记录的CompositionContainer对象模型无关)

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

MEF允许吗?

3 个答案:

答案 0 :(得分:2)

您可以使用CompositionContainerGetExportXXXXX方法:

获得单个部分:

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 );

免责声明:我没有机会对此进行测试。