MEF - 每个Import都需要出口吗?

jax*_*xbo 3 .net mef c#-4.0

我试过从其他帖子中搜索此内容,但无法找到答案,因此创建了一个新问题.

我正在构建一个ETL系统.

现在我有一个具有以下进口的类:

        [Import]
        public IDataExtractor DataExtractor { get; set; }
        [Import]
        public IDataTransformer DataTransformer { get; set; }
        [Import]
        public  IDataValidator DataValidator { get; set; }
        [Import]
        public IDataPublisher DataPublisher { get; set; }
        [Import]
        public  IDataUpdater DataUpdater { get; set; }
Run Code Online (Sandbox Code Playgroud)

我的program.cs有以下代码组成:

            var catalog = new AggregateCatalog();
            if (!string.IsNullOrEmpty(ConfigKeys["Extractor"]))
                catalog.Catalogs.Add(new DirectoryCatalog(ConfigKeys["Extractor"]));
            if (!string.IsNullOrEmpty(ConfigKeys["Transformer"]))
                catalog.Catalogs.Add(new DirectoryCatalog(ConfigKeys["Transformer"]));
            if (!string.IsNullOrEmpty(ConfigKeys["Validator"]))
                catalog.Catalogs.Add(new DirectoryCatalog(ConfigKeys["Validator"]));
            if (!string.IsNullOrEmpty(ConfigKeys["Publisher"]))
                catalog.Catalogs.Add(new DirectoryCatalog(ConfigKeys["Publisher"]));
            if (!string.IsNullOrEmpty(ConfigKeys["Updater"]))
                catalog.Catalogs.Add(new DirectoryCatalog(ConfigKeys["Updater"]));
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
Run Code Online (Sandbox Code Playgroud)

其中ConfigKeys []是我的配置管理系统,我可以指定,每个提取器,转换器,验证器等的dll路径.

整个过程是:提取,转换,验证,发布,更新.

某些时候,所需要的只是要执行的3个功能:提取,转换,发布.因此,如果Config系统没有Validator dll的路径,我不想要IDataValidator接口的实例.但是,如果我指定一个空白,我会在合成期间收到错误.

错误:组成保持不变.由于以下错误,更改被拒绝:组合产生多个组合错误,有4个根本原因.根本原因如下.查看CompositionException.Errors属性以获取更多详细信息."组合产生了一个组合错误.根本原因如下所示.查看CompositionException.Errors属性以获取更多详细信息.\ r \n\r \n1)未找到与约束匹配的导出:\n\t\tContractName\tCTP.DCU.Models.Interfaces.IDataTransformer \n\tRequiredTypeIdentity\tCTP.DCU.Models.Interfaces.IDataTransformer\r \n"

我的问题是:对于每个IMPORT,我可能没有EXPORT,我想要优雅地处理它.有没有办法在MEF中做到这一点?我该如何处理这种情况?我想创建用于替换的空虚拟存根,但实际上每个人都在做什么?

谢谢!

por*_*ges 11

如果你想做一个[Import]可选的,你可以使用AllowDefault:

[Import(AllowDefault = true)]
public IDataTransformer DataTransformer { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果没有匹配,[Export]那么DataTransformer将保留该属性null.