代码之家  ›  专栏  ›  技术社区  ›  Lord Darth Vader

ninject insingletonscope在每个请求中插入单个参数

  •  0
  • Lord Darth Vader  · 技术社区  · 8 年前

    我用的是Ninject

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

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

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

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

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

    你知道怎么做吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Lord Darth Vader    8 年前

    这可能不是实现这一点的最佳方法,但它是有效的,创建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;
            });
    
        2
  •  0
  •   Scott Hannen    8 年前

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

    该类已注册为ninject的singleton。这意味着Ninject第一次解决 IConsistencyCheckCacheHelper 它将创建 ConsistencyCheckCacheHelper ,然后它将反复使用同一个实例。

    所以ninject没有将依赖项的相同实例注入 一致性检查cachehelper 一遍又一遍。它只创建了 一致性检查cachehelper 因此,无论将依赖项的任何实例注入到它中都不会改变。

    如果您希望在 一致性检查cachehelper 每次解决后都要更改,则不能将其注册为单例。您需要使用不同的范围。

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

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

    它仍然比那要复杂一点。例如,如果 一致性检查cachehelper 注册为临时实例,每次都创建一个新实例。但如果这取决于别的东西 那个 依赖项注册为单个实例,每个新实例 一致性检查cachehelper 将接收该依赖项的同一个单实例。

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

    Ninject object scopes

    推荐文章