2016-10-08 17 views
0

我使用MEF(从的NuGet System.Composition)+ Common.Logging和具有调用ILog的类,例如,如何履行System.Composition MEF ImportingConstructor用一个实例

[Export(typeof(ITranslator))] 
public class ATranslator : BaseTranslator 
{ 
    [ImportingConstructor] 
    public ATranslator(ILog log) 
    { 
... 
    } 

记录器实例可以从Common.Logging通过log = LogManager.GetLogger<ITranslator>();获得,但是如何将其插入到我的合成容器中?

 var container = new ContainerConfiguration() 
      .WithAssembly(typeof(ITranslator).Assembly) 
      .CreateContainer();    
     container.SatisfyImports(this); 

让我可以

[ImportMany] 
    private IEnumerable<ITranslator> Translators { get; set; } 

没有

System.Composition.Hosting.CompositionFailedException:没有出口被 发现合同 '的ILog' - 通过进口所需>“日志'部分'ITranslator []' - >需要通过合同的初始请求'IEnumerable {IsImportMan y = True}'

回答

1

也许您可以尝试将其导出为ILog作为其他类中的属性?

public class LogExporter 
{ 
    [Export(typeof(ILog))] 
    public ILog Log 
    { 
     return LogManager.GetLogger<ITranslator>(); 
    } 
} 

或者你可以尝试使用ComposeExportedValue Method它的代码做的属性,而不是:

container.ComposeExportedValue<ILog>(LogManager.GetLogger<ITranslator>()); 
+0

这是一个有趣的想法。但我如何使用LogExporter? – tofutim

+0

即使您对LogExporter什么都不做,我认为它会起作用,它只是一个导出属性的虚拟类。你可以试试吗? – YuvShap

+0

我刚试过,它看起来像它的工作,虽然我不明白如何。 :) – tofutim