C# Ninject InSingletonScope在每个请求中注入单个参数

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(); 第一次创建类时,该类中就注入了一些必需的依赖项,然后每次都注入相同

我正在使用Ninject

我有一个类,我正在使用它来保存和构建一些缓存数据(如果需要)。它在我的Niject绑定中设置如下

    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作用域