.net - MEF - 每个进口都需要导出吗?

标签 .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);

在哪里 配置键[] 是我的配置管理系统,我可以在其中指定每个提取器、转换器、验证器等的 dll 路径。

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

某些时候,只需要执行 3 个函数:提取、转换、发布。
因此,如果 Config 系统没有 Validator dll 的路径,我不想要 IDataValidator 接口(interface)的实例。
但是如果我指定一个空白,我会在合成过程中得到一个错误。

错误 : 成分保持不变。由于以下错误,更改被拒绝: 合成产生了多个合成错误,有 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 中做到这一点?我该如何处理这种情况?
我想创建空的虚拟 stub 来代替,但真的是每个人都这样做吗?

谢谢!

最佳答案

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

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

如果没有匹配的[Export]然后 DataTransformer属性(property)将被留下null .

关于.net - MEF - 每个进口都需要导出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19435676/

相关文章:

c# - 在自定义 RegularExpressionAttribute 中,构造函数不会在第一次调用后调用

c# - 使用带有目标对象信息的 MEF 注入(inject)对象

c# - 如何使用 Moq 来满足单元测试的 MEF 导入依赖?

c# - 在子对象属性上使用 Sum 的 LINQ to Entities 查询问题

c# - WPF:验证确认密码

c# - .NET 4 缓存支持

c# - 是否有适用于 .Net 3.5 的 C#4.0 更改列表?

c# - Windows 7 中的鼠标移动 - 左键单击并拖动

c# - Thread.Join() 需要帮助

silverlight - MEF 和银光 : How do I navigate to a page in another XAP?