使用MEF动态加载接口

时间:2014-03-17 12:34:14

标签: c# interface mef

我有以下3个接口:

    public interface IWcfSvc

    public interface IAdventureWorks : IWcfSvc
    public interface INorthwind : IWcfSvc

他们都在自己的集会中。我想知道的是,如何使用MEF加载IAdventureWorks和INorthwind?正如您可能已经理解的那样,IWcfSvc是WCF将作为ServiceContracts使用的所有其他接口的默认接口。

到目前为止,我能够将MEF用于一个特定的接口,但我想让它变得动态,因为WCF服务将是自托管的,并且需要可以添加新服务而无需更改核心自托管服务。

1 个答案:

答案 0 :(得分:2)

这种情况让我想起了IClassifierProvider在Visual Studio SDK中的注册方式。虽然许多分类器提供程序可以在整个Visual Studio及其许多扩展中导出,但通常很少(可能只有一个)适用于您打开进行编辑的任何单个文档。要将特定IClassifierProvider出口与有限数量的文档相关联,metadata attribute将应用于导出,例如如下:

[Export(typeof(IClassifierProvider))]
[ContentType("My Content Type")]
public class MyClassifierProvider : IClassifierProvider

元数据属性在MEF内部是高效且受到良好支持的。在您的应用程序中,您可以通过以下方式之一将它们公开给用户:

  1. 使用标准ExportMetadataAttribute属性。如果Visual Studio完成此操作,它可能如下所示。

    [Export(typeof(IClassifierProvider))]
    [ExportMetadata("Content Type", "My Content Type")]
    public class MyClassifierProvider : IClassifierProvider
    
  2. 创建自定义属性,以反映您希望扩展程序提供的特定元数据。