2016-10-08 51 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