MEF - 如何使用ExportProvider仅选择一个导出

时间:2010-08-10 13:30:07

标签: c# import export mef

我真的不懂。

说我有一些具有相同界面的类,我想导出。

[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service1))]   
public class Service1 : IService
{...}
[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service2))]   
public class Service2 : IService
{...}
[Export(typeof(IService))]
[ExportMetadata("ExportType", typeof(Service3))]   
public class Service3 : IService
{...}

现在我有一个导入IService的类,这个类与服务无关。

public class Blup
{
   [ImPortingConstructor]
   public Blup(IService service)
   {}
}

我现在尝试实现的是构建一个ExportProvider,它在Compose上选择正确的Export。

这样的事情:

public TypeExportProvider<TTypeToExport>() : ExportProvider
{}

我真的不知道如何

protected override IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition)

应该是这样的。也许有人知道博客可以阅读这个。有很多自定义的ExportProvider样本,但不适用于这种情况。

THX

2 个答案:

答案 0 :(得分:2)

嗨肯特,如果你看一下导出有名为“ExportType”的元数据,这应该是自定义exportprovider的选择器。 但在这里发布后,发现了一个来自glenn block的博客文章。所以为了我的特殊目的,我必须这样做:

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var defaults = new CatalogExportProvider(new TypeCatalog(typeof(Service2))); 
var container = new CompositionContainer(catalog, defaults); 
defaults.SourceProvider = container;

如果能够编写一个从元数据信息中选择正确导出的自定义exportprovider,那就更好了。我的问题是如何从ImportDefnition中选择正确的信息,以及如何在GetExportsCore()中设置新的Export(...)。

答案 1 :(得分:0)

MSDN Magazine article说明了如何检索和使用导出元数据。基本上,您使用CompositionContainer上的GetExports()方法来获取类型和元数据,然后允许您根据元数据值选择类型。