3

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

我正在构建一个 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,我可能没有 EXPORT,我想优雅地处理它。有没有办法在 MEF 中做到这一点?我该如何处理这种情况?我想创建空的虚拟存根来代替,但真的是每个人都这样做吗?

谢谢!

4

1 回答 1

11

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

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

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

于 2013-10-17T19:39:29.280 回答