【问题标题】:MEF - How can i use an ExportProvider to select just one ExportMEF - 我如何使用 ExportProvider 仅选择一个导出
【发布时间】:2011-03-27 20:09:32
【问题描述】:

我真的不明白它的工作。

假设我有一些具有相同接口的类要导出。

[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 上选择正确的导出。

类似这样的:

public TypeExportProvider<TTypeToExport>() : ExportProvider
{}

我真的不知道是怎么回事

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

应该看起来像。也许有人知道一个博客来阅读这个。有很多自定义 ExportProvider 示例,但不适用于这种情况。

谢谢

【问题讨论】:

    标签: c# import export mef


    【解决方案1】:

    您好 Kent,如果您查看导出,则有名为“ExportType”的元数据,这应该是自定义导出提供程序的选择器。 但是在这里发布后,发现了来自 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;
    

    很高兴看到我如何编写自定义导出提供程序,从元数据信息中选择正确的导出。我的问题是如何从 ImportDefnition 中选择正确的信息以及如何在 GetExportsCore() 中设置新的 Export(...)。

    【讨论】:

    • 如果我理解你的问题,我在这里有一个类似的问题:stackoverflow.com/questions/9626227/… 在我的特殊情况下,我想在为要注入的构造函数参数提供一些输入参数时查询导出.
    【解决方案2】:

    MSDN Magazine article 解释了如何检索和使用导出元数据。本质上,您使用 CompositionContainer 上的 GetExports() 方法来获取类型和元数据,然后您可以根据元数据值选择类型。

    【讨论】:

    • 在使用惰性时使用元数据进行导入 不是问题。我的问题是我如何对待 mef 组合(ExportProvider)只选择一个导出,而有很多导出来满足我的 ExatlyOneImport。
    • 这取决于您选择一个导出的标准。 GetExports().First() 或对 GetExports() 的结果使用 LINQ 查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多