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