我想将缓存实例作为依赖项传递给一个或多个类型。当实例化高速缓存的具体实例时,必须提供有关将使用它的类型的信息。
我意识到这是一个常见的任务,注入缓存依赖关系出现在各种问题/答案中;我正在设置一个与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 );
} );
但结果出乎意料。
Type
的{{1}}属性设置为绑定类型(Target
),而不是“将接收注入的目标”(IMethodCache
)。
以另一种方式说明:创建依赖项时,我需要将injectable的类型传递给它。
我可以使用CacheConsumer
获取所需信息。但是,我很担心因为我不知道依赖声明类型的后果 - 更重要的是 - 因为这似乎与文档相反。
context.Request.Target.Member.DeclaringType
答案 0 :(得分:3)
是的,在这种情况下,文档似乎不完整/不正确。
您可以从ctx.Request.Target
属性开始获取“目标”类型信息,但是您需要使用Member
和ctx.Request.Target.Member.DeclaringType
进一步“更进一步”已经注意到了。
所以如果你检查上面提到的Ninject.Extensions.Loggin,你可以使用context.Request.Target.Member.DeclaringType
完全没问题,你会在
/// <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);
}