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

How to get implementing type during Ninject dependency resolve?

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

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

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

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

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