我曾尝试从其他帖子中寻找答案,但未能找到答案,所以创建了一个新问题。
我正在构建一个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中有什么方法可以做到这一点?如何处理这种情况?我考虑创建空的虚拟存根以替代,但真的每个人都这样做吗?
谢谢!