如何在Ninject依赖解析期间获得实现类型?

时间:2015-05-26 11:45:39

标签: c# ninject

我使用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获取实现类型但没有成功。有没有办法获得实现类型?

1 个答案:

答案 0 :(得分:2)

thisthat涵盖了您的问题,但它们并不完全重复,因此我会重新发布此信息:

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

所以context.Request.ParentContext.Plan.Type是注入的ILog类型。如果你想要IResolutionRoot.Get<ILog>(),那么就不会有注入ILog的类型,因此也不会成为ParentContext。在这种情况下,您需要按照之前的解决方案进行null检查:

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