MEF配置

Fer*_*ndo 5 c# mef c#-4.0

是否有MEF的配置文件设置,或者是否所有内容都在代码中完成?

如果所有内容都在代码中,那么在导出的不同类之间进行切换的最佳做法是什么?即如果A类和B类都导出IMyExport,那么"配置"应用程序使用A或使用B的一些好方法是什么?

Adi*_*ter 7

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

除此之外,由课程本身决定他们想要使用哪种实现.实现目标的一种可能方法是使用合同名称

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

[Export("Another Contract Name", typeof(IMyExport))]
public class B : IMyExport { }
Run Code Online (Sandbox Code Playgroud)

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

[Import("Another Contract Name")]
public IMyExport MyExport { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果您知道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
    }
}
Run Code Online (Sandbox Code Playgroud)