首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用实例实现System.Composition MEF

如何用实例实现System.Composition MEF
EN

Stack Overflow用户
提问于 2016-10-08 06:51:49
回答 1查看 1.1K关注 0票数 0

我使用的是MEF (System.Composition from nuget) + Common.Logging,并且有调用ILog的类,例如,

代码语言:javascript
复制
[Export(typeof(ITranslator))]
public class ATranslator : BaseTranslator
{
    [ImportingConstructor]
    public ATranslator(ILog log)
    {
...
    }

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

代码语言:javascript
复制
        var container = new ContainerConfiguration()
            .WithAssembly(typeof(ITranslator).Assembly)
            .CreateContainer();            
        container.SatisfyImports(this);

所以我可以

代码语言:javascript
复制
    [ImportMany]
    private IEnumerable<ITranslator> Translators { get; set; }

不带

System.Composition.Hosting.CompositionFailedException :未发现合同“ILog”->的出口,该合同是进口“ATranslator”部分的“日志”所要求的,“ATranslator”部分的->是“ITranslator[]”部分的进口“项目”,“ITranslator[]”是最初请求合同“IEnumerable{ IsImportMany = True }”所需的->。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-08 07:02:31

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

代码语言:javascript
复制
public class LogExporter
{
    [Export(typeof(ILog))]
    public ILog Log
    {
        return LogManager.GetLogger<ITranslator>();
    }
}

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

代码语言:javascript
复制
container.ComposeExportedValue<ILog>(LogManager.GetLogger<ITranslator>());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39929591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档