如何使用MEF IsMultiple属性

时间:2012-05-08 15:21:03

标签: .net-4.0 mef

后台:我正在尝试让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有两个IFoos。

我想将一个定义为默认值,因此如果不需要“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标记类?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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