2013-10-17 18 views
3

我试图从其他帖子寻找这个,但无法找到答案,所以创建一个新的问题。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); 

ConfigKeys []是我的配置管理系统,我可以指定,每个提取器,变压器,验证器等DLL的路径。

完整的过程我s:提取,转换,验证,发布,更新。

某些时候,所有需要的是要执行的3个函数:提取,转换,发布。 所以如果配置系统,没有一个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有没有办法做到这一点?我该如何处理这种情况? 我想创建空的虚拟存根替代,但真的是每个人都做的?

谢谢!

回答

9

如果你想打一个[Import]可选的,你可以使用AllowDefault

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

如果没有匹配[Export],则DataTransformer财产将留给null

+0

美...... Thx @Porges – jaxxbo