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

时间:2018-05-20 16:27:03

标签: c# dependency-injection ninject ninject.web.mvc

我正在使用Ninject

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

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

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

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

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

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

2 个答案:

答案 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可能是安全的。如果我确定我可以安全地重用该类的一个实例以及一个实例(如果它的依赖关系及其依赖关系等),那么我只使用单例范围。

Ninject object scopes