首页
学习
活动
专区
圈层
工具
发布

MEF配置
EN

Stack Overflow用户
提问于 2012-07-21 03:12:29
回答 1查看 2K关注 0票数 5

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-21 03:50:13

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

除此之外,要由类自己决定要使用哪种实现。实现所需功能的一种可能方法是使用合同名称

代码语言:javascript
复制
[Export("My Contract Name", typeof(IMyExport))]
public class A : IMyExport { }

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

然后,导入IMyExport的类可以指定要使用的部件

代码语言:javascript
复制
[Import("Another Contract Name")]
public IMyExport MyExport { get; set; }

如果您知道某个依赖项IMyExport可以多次导出,则可以使用add metadata to the export,并在运行时根据其元数据决定要使用哪个导出。如果您遵循这个方向,您的代码将如下所示

代码语言:javascript
复制
[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
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11585597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档