MEF - 每个导入都需要存在一个导出吗?

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个函数:抽取、转换、发布。如果配置系统没有验证器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中有什么方法可以做到这一点?如何处理这种情况?我考虑创建空的虚拟存根以替代,但真的每个人都这样做吗?
谢谢!
1个回答

11

如果您想使 [Import] 成为可选项,可以使用 AllowDefault

[Import(AllowDefault = true)]
public IDataTransformer DataTransformer { get; set; }
如果没有匹配的[Export]DataTransformer属性将保持为null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接