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

时间:2013-10-17 19:37:21

标签: .net c#-4.0 mef

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

我正在构建一个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; }

我的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);

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

完整的过程是:提取,转换,验证,发布,更新。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:10)

如果您想要[Import]可选,可以使用AllowDefault

[Import(AllowDefault = true)]
public IDataTransformer DataTransformer { get; set; }

如果没有匹配的[Export],则DataTransformer属性将保留null