我试过从其他帖子中搜索此内容,但无法找到答案,因此创建了一个新问题.
我正在构建一个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; }
Run Code Online (Sandbox Code Playgroud)
我的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);
Run Code Online (Sandbox Code Playgroud)
其中ConfigKeys []是我的配置管理系统,我可以指定,每个提取器,转换器,验证器等的dll路径.
整个过程是:提取,转换,验证,发布,更新.
某些时候,所需要的只是要执行的3个功能:提取,转换,发布.因此,如果Config系统没有Validator dll的路径,我不想要IDataValidator接口的实例.但是,如果我指定一个空白,我会在合成期间收到错误.
错误:组成保持不变.由于以下错误,更改被拒绝:组合产生多个组合错误,有4个根本原因.根本原因如下.查看CompositionException.Errors属性以获取更多详细信息."组合产生了一个组合错误.根本原因如下所示.查看CompositionException.Errors属性以获取更多详细信息.\ r \n\r \n1)未找到与约束匹配的导出:\n\t\tContractName\tCTP.DCU.Models.Interfaces.IDataTransformer \n\tRequiredTypeIdentity\tCTP.DCU.Models.Interfaces.IDataTransformer\r \n"
我的问题是:对于每个IMPORT,我可能没有EXPORT,我想要优雅地处理它.有没有办法在MEF中做到这一点?我该如何处理这种情况?我想创建用于替换的空虚拟存根,但实际上每个人都在做什么?
谢谢!
por*_*ges 11
如果你想做一个[Import]
可选的,你可以使用AllowDefault
:
[Import(AllowDefault = true)]
public IDataTransformer DataTransformer { get; set; }
Run Code Online (Sandbox Code Playgroud)
如果没有匹配,[Export]
那么DataTransformer
将保留该属性null
.
归档时间: |
|
查看次数: |
837 次 |
最近记录: |