我曾尝试从其他帖子中搜索此内容,但无法找到答案,因此创建了一个新问题。
我正在构建一个 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 中做到这一点?我该如何处理这种情况?我想创建空的虚拟存根来代替,但真的是每个人都这样做吗?
谢谢!