【问题标题】:MEF - Does every Import need an Export to be present?MEF - 每个进口都需要出口吗?
【发布时间】:2026-02-10 02:45:01
【问题描述】:

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

我正在构建一个 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 中做到这一点?我该如何处理这种情况? 我想过创建空的虚拟存根来代替,但真的是每个人都这样做吗?

谢谢!

【问题讨论】:

    标签: .net c#-4.0 mef


    【解决方案1】:

    如果你想让[Import] 可选,你可以使用AllowDefault

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

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

    【讨论】: