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

How to fulfill System.Composition MEF ImportingConstructor with an instance

我正在使用 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 : No export was found for the contract 'ILog' -> required by import 'log' of part 'ATranslator' -> required by import 'item' of part 'ITranslator[]' -> required by initial request for contract 'IEnumerable { IsImportMany = True }'

也许您可以尝试在其他 class 中以 属性 的形式导出到 ILog?

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

或者您可以尝试使用 ComposeExportedValue Method 和代码而不是属性来做到这一点:

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