Ninject 3激活上下文包含意外的类型信息

时间:2013-12-19 20:26:56

标签: c# ninject

设置

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

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

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 ) { }
}

文档

Ninject documentation shows how to do just that(以日志为例):

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

Bind<ILog>().ToMethod( context => LogFactory.CreateLog( context.Request.Target.Type ) );

上一个示例显示context.Request.Target.Type将包含发生注入的类型的类型信息

此外,关于context.Request.Target州的评论:

  

获取将接收注入的目标(如果有)。

结果

基于此,我希望看到有关实例接收注入的信息。我按如下方式设置我的绑定:

kernel.Bind<IMethodCache>().ToMethod( 
  ctx =>
  {
      return new MethodCache( ctx.Request.Target.Type );
  } );

但结果出乎意料。

enter image description here

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

以另一种方式说明:创建依赖项时,我需要将injectable的类型传递给它。

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

问题

  • 我是否正确理解文档?
  • 如果是的话,我做错了什么?
  • 如果没有,我如何实现将类型信息传递给我的依赖项(缓存)的构造函数的目标?

其他详情

  • Ninject 3.0.1.10
  • 组合根是Windows服务的开始事件
  • 我正在使用context.Request.Target.Member.DeclaringType

1 个答案:

答案 0 :(得分:3)

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

您可以从ctx.Request.Target属性开始获取“目标”类型信息,但是您需要使用Memberctx.Request.Target.Member.DeclaringType进一步“更进一步”已经注意到了。

所以如果你检查上面提到的Ninject.Extensions.Loggin,你可以使用context.Request.Target.Member.DeclaringType完全没问题,你会在

中看到以下内容

source code

/// <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);
}