我试过从其他帖子中搜索此内容,但无法找到答案,因此创建了一个新问题。
我正在构建一个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,我可能没有导出,我想优雅地处理它。有没有办法在MEF中做到这一点?我该如何处理这种情况? 我想创建用于替换的空虚拟存根,但实际上每个人都在做什么?
谢谢!
答案 0 :(得分:10)
如果您想要[Import]
可选,可以使用AllowDefault
:
[Import(AllowDefault = true)]
public IDataTransformer DataTransformer { get; set; }
如果没有匹配的[Export]
,则DataTransformer
属性将保留null
。