3

背景: 我试图让 MEF 导入两个实现 IFoo 的程序集。为此,不出所料,我使用 [ImportMany] 导入所有给我一个 IEnumerable> 的东西。然后我的消费逻辑根据元数据“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 标记一个类?

谢谢!

4

1 回答 1

3

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

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

    [Export, ExportMetadata(...)]
    public IFoo Default { get { return this; } }
}
于 2012-05-10T16:08:14.743 回答