【问题标题】:How to use MEF IsMultiple property如何使用 MEF IsMultiple 属性
【发布时间】:2012-05-08 15:21:02
【问题描述】:

背景:我正在尝试让 MEF 导入两个实现 IFoo 的程序集。为此,不出所料,我使用 [ImportMany] 来导入所有给我的 IEnumerable>。然后我的消费逻辑根据 MetaData "Bar" 确定要使用哪个导入的程序集。

每个导出器都装饰有一个 ExportMetadata 属性。当我有以下情况时,这可以正常工作:

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "Hello")]
public class Hello : IFoo
{...}

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "World")]
public class World: IFoo
{...}

也就是说,我的 IEnumerable 有两个 IFoo。

我想将一个定义为默认值,因此如果不需要“Hello”或“World”,我将寻找具有“Default”作为我的 Bar 元数据的那个。我试图使用这样的 IsMultiple 属性来做到这一点:

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "Hello", IsMultiple = true)]
[ExportMetadata("Bar", "Default", IsMultiple = true)]
public class Hello : IFoo
{...}

问题:当我添加 IsMultiple 属性和第二个属性时,Hello 类不再被拉入生成的 IEnumerable。

问题:如何使用第二个/默认名称为 MEF 标记一个类?

谢谢!

【问题讨论】:

    标签: .net-4.0 mef


    【解决方案1】:

    要在这样的类上公开多个完全独立的导出,最好的方法是使用多个“属性导出”,在这种情况下返回“this”。

    class Hello: IFoo
    {
        [Export, ExportMetadata(...)]
        public IFoo Bar { get { return this; } }
    
        [Export, ExportMetadata(...)]
        public IFoo Default { get { return this; } }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 2011-02-09
      • 2012-03-31
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多