代码之家  ›  专栏  ›  技术社区  ›  VinnyG

使用ninject和mongodb时使用singleton vs transient vs request

  •  21
  • VinnyG  · 技术社区  · 14 年前

    当我在global.cs文件中进行绑定时,我不确定什么时候应该使用singletonscope()vs transientscope()vs requestscope()。

    例如,我打电话给MongoSession(使用Norm和MVCStarter项目 http://mvcstarter.codeplex.com/ )它被设置为singletonscope,但是我创建了一个存储库,使用这个mongosession对象可以更容易地调用mongo,例如,我有一个新闻存储库,它使用mongosession从数据中提取我的新闻项。例如,我有一个调用,它获取的新闻项将displayonhome设置为true,并通过creationDate获取最新的消息。这样的存储库应该是singletonscope还是requestscope更合适?

    我应该什么时候使用每一个,为什么?

    3 回复  |  直到 8 年前
        1
  •  21
  •   fordareh    8 年前

    一般来说,在Web应用程序中,您希望状态尽可能成为请求范围。

    只有在非常低级别的优化的情况下,您才有可能遇到这样一种情况:在这种情况下,创建单例对象是合适的(即使这样,也有可能将这种缓存/共享逻辑拉到另一个类中,该类作为对其他[请求范围]对象的依赖而拉入,并使 那个 单点范围)。请记住,Web应用程序上下文中的单个实例意味着使用相同对象的多个线程。这很少是好消息。

    在同样的基础上,瞬时范围是最直接的默认值(这也是Ninject 2为什么这么做的原因)-请求范围应该只在出于性能原因等需要共享某些内容时(或者因为这只是共享的上下文[在另一个答案中提到的])才进入等式。

        2
  •  3
  •   jrista    14 年前

    我想答案将取决于 MongoSession 是否表示工作单位。我处理过的大多数与数据库相关的类(主要在ORM的上下文中,如nhibernate或ef4)都围绕上下文、实体和表示 工作单位 . 一个工作单元的保存时间决不应超过执行给定工作单元所需的时间长度,在此之后,该单元应被提交或回滚。那就意味着你应该使用 RequestScope .

    如果你 单亲 作为一个工作单元,您可以在MVC会话的整个生命周期中保留它,在这种情况下 SessionScope 那就合适了。

        3
  •  0
  •   Ruben Bartelink    8 年前

    从上述@shankbond要求的已删除问题


    这个 Dispos AL不一定像人们想象的那样在主请求线程上同步执行。

    你可能想藏一个 Block 然后 Dispose() 它在您请求的适当阶段(您将如何处理异常?)

    在9个测试中看看更多的例子(说真的,去看一看——它们简短而清晰,当我第三次听到别人告诉我的时候,我并不后悔!)

    http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/

    推荐文章