5

是否有任何 MEF 的配置文件设置,或者一切都在代码中完成?

如果一切都在代码中,那么在进行导出的不同类之间切换的最佳实践是什么?即,如果 A 类和 B 类都导出 IMyExport,那么有哪些好方法可以“配置”应用程序以使用 A 或使用 B?

4

1 回答 1

7

据我所知,MEF 没有配置文件。如果您希望您的应用程序使用一个实现而不是另一个实现,您可能会创建一个新的ConfigurationCatalog,它将获取配置文件作为输入,并且只会导出它告诉它的部分。MefContrib中可能已经存在类似的东西,所以我会在那里检查。

除此之外,由类自己决定他们想使用哪个实现。实现您想要的一种可能方法是使用合同名称

[Export("My Contract Name", typeof(IMyExport))]
public class A : IMyExport { }

[Export("Another Contract Name", typeof(IMyExport))]
public class B : IMyExport { }

然后类导入IMyExport可以指定要使用哪些部分

[Import("Another Contract Name")]
public IMyExport MyExport { get; set; }

如果您知道某个依赖项IMyExport可以多次导出,则可以将元数据添加到导出中,并在运行时根据其元数据决定要使用哪些导出。如果你按照这个方向走,你的代码看起来像这样

[MySpecialExport(SomeData = "ABC")]
public class A : IMyExport { }

[MySpecialExport(SomeData = "DEF")]
public class B : IMyExport { }

public class MyClass
{
    [ImportMany(typeof(IMyExport))]
    public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; }

    public void DoSomething()
    {
        var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF");
        IMyExport myExport = myLazyExport.Value;

        // Do something with myExport
    }
}
于 2012-07-20T19:50:13.200 回答