首页 > 解决方案 > Ninject InSingletonScope 在每个请求中注入单个参数

问题描述

我正在使用忍者

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

    kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();

类在第一次创建类时注入了一些必需的依赖项,然后每次都注入同一个实例。

但是在需要重建数据的情况下,我需要注入运行时依赖项。

我将其用作应用程序范围的缓存,

任何想法如何做到这一点?

标签: c#dependency-injectionninjectninject.web.mvc

解决方案


类在第一次创建类时注入了一些必需的依赖项,然后每次都注入同一个实例。

该类已在 Ninject 注册为单例。这意味着 Ninject 第一次解析 anIConsistencyCheckCacheHelper时会创建 的实例ConsistencyCheckCacheHelper,然后它会一遍又一遍地使用同一个实例。

ConsistencyCheckCacheHelper所以 Ninject 不会一遍又一遍地注入相同的依赖实例。它只创建一个 的实例ConsistencyCheckCacheHelper,因此注入的任何依赖项实例都不会改变。

如果您希望使用 byConsistencyCheckCacheHelper中的依赖项在每次解析时都更改,那么您不能将其注册为单例。您将需要使用不同的范围。

.InTransientScope()(默认值)意味着每次解析一个类型时都会创建一个新实例。

.InRequestScope()意味着为每个 Web 请求创建一个新实例。

它仍然比这复杂一点。例如,如果ConsistencyCheckCacheHelper注册为瞬态,则每次都会创建一个新实例。但是,如果它依赖于其他东西并且依赖项被注册为单例,则每个新实例都ConsistencyCheckCacheHelper将收到该依赖项的相同单例实例。

通常建议我们从临时依赖项开始。除非我们特别需要重用一个实例,否则创建新对象的成本可能不会那么高。对于 Web 应用程序,InRequestScope可能是安全的。如果我确定我可以安全地重用该类的一个实例以及一个实例(如果它的依赖项及其依赖项等等),我只会使用单例范围。

Ninject 对象范围


推荐阅读