C# Ninject InSingletonScope在每个请求中注入单个参数
我正在使用Ninject 我有一个类,我正在使用它来保存和构建一些缓存数据(如果需要)。它在我的Niject绑定中设置如下C# Ninject InSingletonScope在每个请求中注入单个参数,c#,dependency-injection,ninject,ninject.web.mvc,C#,Dependency Injection,Ninject,Ninject.web.mvc,我正在使用Ninject 我有一个类,我正在使用它来保存和构建一些缓存数据(如果需要)。它在我的Niject绑定中设置如下 kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope(); kernel.Bind().To().InSingletonScope(); 第一次创建类时,该类中就注入了一些必需的依赖项,然后每次都注入相同
kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();
kernel.Bind().To().InSingletonScope();
第一次创建类时,该类中就注入了一些必需的依赖项,然后每次都注入相同的实例
但是在需要重建数据的情况下,我需要注入运行时依赖项
我将其用作应用程序范围的缓存
有没有办法做到这一点?这可能不是最好的方法,但它是有效的,创建两个代表同一类的接口
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;
});
kernel.Bind().To().InSingletonScope();
kernel.Bind().ToMethod(a=>
{
DepInterfaceOne toReturn=kernel.Get();
toreReturn.inforequiredfortruntime(HttpContext.Current.Session[“InfoRequired”]);
回归回归;
});
第一次创建类时,该类中就注入了一些必需的依赖项,然后每次都注入相同的实例
该类已作为singleton在Ninject中注册。这意味着Ninject第一次解析一个IConsistencCheckCacheHelper
时,它将创建一个consistencCheckCacheHelper
的实例,然后它将反复使用同一个实例
所以Ninject并不是一次又一次地将依赖项的同一个实例注入到ConsistencyCheckCacheHelper
中。它只创建了一个ConsistencyCheckCacheHelper
的实例,因此注入依赖项的任何实例都不会改变
如果希望ConsistencyCheckCacheHelper
使用的内部依赖项在每次解析时都发生更改,则不能将其注册为单例。您需要使用不同的作用域
.InTransientScope()
(默认值)表示每次解析类型时都会创建一个新实例
.InRequestScope()
意味着为每个web请求创建一个新实例
它仍然比那稍微复杂一点。例如,如果ConsistencyCheckCacheHelper
注册为transient,则每次都会创建一个新实例。但是,如果它依赖于其他内容,并且该依赖项被注册为单例,那么一致性checkcachelper
的每个新实例将接收该依赖项的相同单例实例
通常建议我们从暂时依赖开始。除非我们特别需要重用实例,否则创建新对象的成本可能不会太高。对于web应用程序,RequestScope中的可能是安全的。如果我确信我可以安全地重用该类的一个实例以及一个实例(如果它的依赖项和它们的依赖项等等),我只会使用singleton作用域