如何使用实例实现System.Composition MEF ImportingConstructor

时间:2016-10-08 06:51:49

标签: c# mef composition

我正在使用MEF(来自nuget的System.Composition)+ Common.Logging并且拥有调用ILog的类,例如,

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

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

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

所以我可以

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

  

System.Composition.Hosting.CompositionFailedException:没有导出   找到合同'ILog' - &gt;部分的导入'log'需要   'ATranslator' - &gt;部分'ITranslator []'的导入'item'需要    - &GT;初始请求合同'IEnumerable {IsImportMany = True}'

需要

1 个答案:

答案 0 :(得分:1)

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

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

或者,您可以尝试使用代码而不是属性ComposeExportedValue Method来执行此操作:

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