Ninject InSingletonScope 每个请求注入单个参数
Ninject InSingletonScope Inject Single Parameter Every Request
我正在使用 Ninject
我有一个 class,如果需要,我用它来保存和构建一些缓存数据。它在我的 Niject 绑定中设置如下
kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();
Class 在第一次创建 class 时注入了一些必需的依赖项,然后每次都注入相同的实例。
但在需要重建数据的情况下,我需要 运行 注入时间依赖性。
我将其用作应用程序范围的缓存,
知道怎么做吗?
这可能不是最好的方法,但它确实有效,创建 2 个表示相同的接口 class
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;
});
The Class has some required dependencies injected into it the first time that the class is created, then that same instance is inject every time.
class 已在 Ninject 中注册为单身人士。这意味着第一次 Ninject 解析一个 IConsistencyCheckCacheHelper
时,它会创建一个 ConsistencyCheckCacheHelper
的实例,然后它会一遍又一遍地使用同一个实例。
所以 Ninject 不会一遍又一遍地将相同的依赖实例注入 ConsistencyCheckCacheHelper
。它只创建一个 ConsistencyCheckCacheHelper
的实例,所以无论注入到它的依赖实例如何,都不会改变。
如果您希望 ConsistencyCheckCacheHelper
使用的依赖项在每次解析时都发生变化,那么您不能将其注册为单例。您需要使用不同的范围。
.InTransientScope()
(默认值)意味着每次解析类型时都会创建一个新实例。
.InRequestScope()
表示为每个网络请求创建一个新实例。
它仍然比那复杂一点。例如,如果 ConsistencyCheckCacheHelper
注册为 transient,则每次都会创建一个新实例。但是如果它依赖于其他东西并且那个依赖项被注册为一个单例,ConsistencyCheckCacheHelper
的每个新实例将接收该依赖项的相同单例实例。
通常建议我们从瞬态依赖性开始。除非我们特别需要重用一个实例,否则创建新对象的成本可能不会那么高。对于 Web 应用程序,InRequestScope
可能是安全的。如果我确定我可以安全地重用该 class 的一个实例,以及它的依赖项和它们的依赖项等的一个实例,我只会使用单例范围。
我正在使用 Ninject
我有一个 class,如果需要,我用它来保存和构建一些缓存数据。它在我的 Niject 绑定中设置如下
kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();
Class 在第一次创建 class 时注入了一些必需的依赖项,然后每次都注入相同的实例。
但在需要重建数据的情况下,我需要 运行 注入时间依赖性。
我将其用作应用程序范围的缓存,
知道怎么做吗?
这可能不是最好的方法,但它确实有效,创建 2 个表示相同的接口 class
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;
});
The Class has some required dependencies injected into it the first time that the class is created, then that same instance is inject every time.
class 已在 Ninject 中注册为单身人士。这意味着第一次 Ninject 解析一个 IConsistencyCheckCacheHelper
时,它会创建一个 ConsistencyCheckCacheHelper
的实例,然后它会一遍又一遍地使用同一个实例。
所以 Ninject 不会一遍又一遍地将相同的依赖实例注入 ConsistencyCheckCacheHelper
。它只创建一个 ConsistencyCheckCacheHelper
的实例,所以无论注入到它的依赖实例如何,都不会改变。
如果您希望 ConsistencyCheckCacheHelper
使用的依赖项在每次解析时都发生变化,那么您不能将其注册为单例。您需要使用不同的范围。
.InTransientScope()
(默认值)意味着每次解析类型时都会创建一个新实例。
.InRequestScope()
表示为每个网络请求创建一个新实例。
它仍然比那复杂一点。例如,如果 ConsistencyCheckCacheHelper
注册为 transient,则每次都会创建一个新实例。但是如果它依赖于其他东西并且那个依赖项被注册为一个单例,ConsistencyCheckCacheHelper
的每个新实例将接收该依赖项的相同单例实例。
通常建议我们从瞬态依赖性开始。除非我们特别需要重用一个实例,否则创建新对象的成本可能不会那么高。对于 Web 应用程序,InRequestScope
可能是安全的。如果我确定我可以安全地重用该 class 的一个实例,以及它的依赖项和它们的依赖项等的一个实例,我只会使用单例范围。