【问题标题】:How to get implementing type during Ninject dependency resolve?如何在 Ninject 依赖解析期间获取实现类型?
【发布时间】:2015-05-26 11:45:38
【问题描述】:

我使用 Log4net 进行日志记录,并且我有很多具有 ILog 依赖项的对象。这些依赖项与其他依赖项一样注入。我想坚持 Log4net 记录器命名约定,以便注入到实例的记录器以实例的类型命名。我一直在为 ILog 使用以下绑定:

Bind<ILog>().ToMethod(ctx =>
    LogManager.GetLogger(ctx.Request.ParentRequest == null ? typeof(object) : ctx.Request.ParentRequest.Service)
);

这违反了命名约定,因为记录器将以接口而不是实现类型命名。

interface IMagic {}

class Magic: IMagic
{
    ILog logger; // The logger injected here should have the name "Magic" instead of IMagic
}

我尝试了几种方法从 ctx 获取实现类型,但均未成功。有没有办法获取实现类型?

【问题讨论】:

    标签: c# ninject


    【解决方案1】:

    thisthat 涵盖了您的问题,但它们并不完全重复,所以我将重新发布:

    Bind<ILog>().ToMethod(context =>
                 LogManager.GetLogger(context.Request.ParentContext.Plan.Type));
    

    所以context.Request.ParentContext.Plan.TypeILog 注入的类型。如果你想做IResolutionRoot.Get&lt;ILog&gt;(),那么就不会有注入ILog 的类型,所以也不会有ParentContext。在这种情况下,您需要像之前的解决方案一样使用null 检查:

    Bind<ILog>().ToMethod(context =>
                 LogManager.GetLogger(context.Request.ParentContext == null ?
                                      typeof(object) : 
                                      context.Request.ParentContext.Plan.Type));
    

    【讨论】:

    • @Hari 感谢建议的编辑 - 它被一些评论者拒绝。每个人都在某个时候发生过;-)。我已经修复了变量不匹配的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多