【问题标题】:How to fulfill System.Composition MEF ImportingConstructor with an instance如何使用实例实现 System.Composition MEF ImportingConstructor
【发布时间】:2016-10-08 06:51:49
【问题描述】:

我正在使用 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”找到 -> 零件的导入“日志”需要 'ATranslator' -> 部分 'ITranslator[]' 的导入 'item' 需要 -> 合同 'IEnumerable { IsImportMany = True }' 的初始请求所必需的

【问题讨论】:

    标签: c# mef composition


    【解决方案1】:

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

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

    或者,您可以尝试使用ComposeExportedValue Method 使用代码而不是属性:

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

    【讨论】:

    • 这是一个有趣的想法。我该如何使用 LogExporter?
    • 我认为即使您对 LogExporter 什么都不做,它也会起作用,它只是一个用于导出属性的虚拟类。可以试试吗?
    • 我刚试了一下,看起来好像可以,虽然我不明白怎么做。 :)
    • 真的很合理,每次编写MEF都会寻找ILog的一个导出属性来满足ILog导入的需求,它会找到这个属性,并将其用作导出类型。跨度>
    • @tofutim 用另一个选项更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多