我正在使用Ninject
我有一个课程,我用来保持&如果需要,构建一些缓存数据。它在我的Niject绑定中设置如下
kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();
Class在第一次创建类时会注入一些必需的依赖项,然后每次都会注入相同的实例。
但是在需要重建数据的情况下,我需要注入运行时依赖项。
我将其用作应用程序范围的缓存,
任何想法如何做到这一点?
答案 0 :(得分:0)
这可能不是最好的方法,但它可行,创建2个代表同一类的接口
public interface DepInterfaceOne
{
int MethodWithCachedData();
void InfoRequiredForAtRunTime(object RunTimeObject);
}
public interface DepInterfaceTwo: IConsistencyCheckCacheHelper
{
}
以这种方式设置绑定
kernel.Bind<DepInterfaceOne>().To<DepInterfaceOneClass>().InSingletonScope();
kernel.Bind<DepInterfaceOneTwo>().ToMethod(a =>
{
DepInterfaceOne toReturn = kernel.Get<DepInterfaceOne>();
toReturn.InfoRequiredForAtRunTime(HttpContext.Current.Session["InfoRequired"]);
return toReturn;
});
答案 1 :(得分:0)
Class在第一次创建类时会注入一些必需的依赖项,然后每次都会注入相同的实例。
该课程已在Ninject注册为单身人士。这意味着Ninject第一次解析IConsistencyCheckCacheHelper
它将创建一个ConsistencyCheckCacheHelper
的实例,然后它会一遍又一遍地使用同一个实例。
所以Ninject并没有反复向ConsistencyCheckCacheHelper
注入相同的依赖实例。它只创建了ConsistencyCheckCacheHelper
的一个实例,因此无论是什么依赖项实例注入它都不会改变。
如果您希望ConsistencyCheckCacheHelper
使用的依赖项在每次解析时都更改,那么您就无法将其注册为单例。您需要使用不同的范围。
.InTransientScope()
(默认值)表示每次解析类型时都会创建一个新实例。
.InRequestScope()
表示为每个Web请求创建一个新实例。
它仍然比这更复杂一点。例如,如果将ConsistencyCheckCacheHelper
注册为瞬态,则每次都会创建一个新实例。但是,如果它依赖于其他内容并且将依赖项注册为单例,则ConsistencyCheckCacheHelper
的每个新实例都将接收该依赖项的相同单例实例。
通常建议我们从瞬态依赖开始。除非我们特别需要重用实例,否则创建新对象的成本可能不会那么高。对于Web应用程序,InRequestScope
可能是安全的。如果我确定我可以安全地重用该类的一个实例以及一个实例(如果它的依赖关系及其依赖关系等),那么我只使用单例范围。