C# Ninject 3激活上下文包含意外的类型信息 安装程序

C# Ninject 3激活上下文包含意外的类型信息 安装程序,c#,ninject,C#,Ninject,我想将缓存实例作为依赖项传递给一个或多个类型。在实例化缓存的具体实例时,必须向其提供有关将使用它的类型的信息 我意识到这是一项常见的任务,注入缓存依赖关系出现在各种问题/答案中;我正在设置一个与Ninject有关的特定问题 文档 Ninject(以日志记录为例): 但结果出乎意料 Target的Type属性设置为要绑定的类型(IMethodCache),而不是“将接收注入的目标”(CacheConsumer) 以另一种方式陈述:当创建依赖项时,我需要将可注入的类型传递给它 我可以使用conte

我想将缓存实例作为依赖项传递给一个或多个类型。在实例化缓存的具体实例时,必须向其提供有关将使用它的类型的信息

我意识到这是一项常见的任务,注入缓存依赖关系出现在各种问题/答案中;我正在设置一个与Ninject有关的特定问题

文档 Ninject(以日志记录为例):

但结果出乎意料

Target
Type
属性设置为要绑定的类型(
IMethodCache
),而不是“将接收注入的目标”(
CacheConsumer

以另一种方式陈述:当创建依赖项时,我需要将可注入的类型传递给它

我可以使用
context.Request.Target.Member.DeclaringType
获得所需的信息。但是,我很担心,因为我不知道依赖声明类型的后果,更重要的是,这似乎与文档相反

问题
  • 我是否正确理解文档
  • 如果是,我做错了什么
  • 如果没有,我如何实现将类型信息传递给依赖项(缓存)的构造函数的目标
其他详情
  • Ninject 3.0.1.10
  • 组合根目录是Windows服务的启动事件
  • 我正在使用
    StandardKernel

是的,在这种情况下,文档似乎不完整/不正确

您可以从
ctx.Request.target
属性开始获取“target”类型信息,但是您需要使用
Member
ctx.Request.target.Member.DeclaringType
,这是您已经注意到的

因此,完全可以使用
context.Request.Target.Member.DeclaringType
,事实上,如果您选中上面提到的

:

//
///获取指定激活上下文的记录器,并在必要时创建它。
/// 
///ninject创建上下文。
///新创建的记录器。
公共ILogger GetLogger(IContext上下文)
{
返回此.GetLogger(context.Request.Target.Member.DeclaringType);
}
interface IMethodCache { }

public class MethodCache : IMethodCache
{
    public MethodCache( Type type )
    {
        // type information is used to build unique cache keys
    }
}

public class CacheConsumer
{
    public CacheConsumer( IMethodCache cache ) { }
}
class ClassThatLogs {
    readonly ILog _log;
    public ClassThatLogs(ILog log){
        _log = log;
    }
}

Bind<ILog>().ToMethod( context => LogFactory.CreateLog( context.Request.Target.Type ) );
kernel.Bind<IMethodCache>().ToMethod( 
  ctx =>
  {
      return new MethodCache( ctx.Request.Target.Type );
  } );
/// <summary>
/// Gets the logger for the specified activation context, creating it if necessary.
/// </summary>
/// <param name="context">The ninject creation context.</param>
/// <returns>The newly-created logger.</returns>
public ILogger GetLogger(IContext context)
{
    return this.GetLogger(context.Request.Target.Member.DeclaringType);
}