何时使用Ninject和MongoDB使用Singleton vs Transient vs Request

时间:2010-07-27 21:21:11

标签: c# asp.net-mvc mongodb ninject norm

当我在global.cs文件中进行绑定时,我不太确定何时应该使用SingletonScope()vs TransientScope()vs RequestScope()。

我有一个MongoSession的调用(使用NoRM和mvcStarter项目http://mvcstarter.codeplex.com/),它被设置为SingletonScope但是我创建了一个使用这个MongoSession对象的存储库来更轻松地调用Mongo,例如,我有一个NewsRepository,它使用MongoSession从数据中获取我的新闻项。作为一个例子,我有一个调用,它获取DisplayOnHome设置为true的新闻项目,并通过CreationDate获取最新的项目。这样的存储库应该是SingletonScope还是RequestScope会更合适?

我什么时候应该使用它们?为什么?

3 个答案:

答案 0 :(得分:21)

通常在Web应用程序中,您希望状态尽可能是请求范围。

只有在非常低级别优化的情况下,您才有可能遇到适合创建单例对象的情况(甚至可能会将这种缓存/共享逻辑拉到另一个类中作为对您的其他[请求范围]对象的依赖而被拉入并使 单一范围)。请记住,Web应用程序上下文中的单例表示使用相同对象的多个线程。这几乎不是好消息。

在相同的基础上,瞬态范围是最直接的默认值(这就是Ninject 2为什么这样做的原因) - 请求范围只应在出于性能原因需要共享某些事物时才会进入等式(或者因为那是简单地说就是共享的背景[如另一个答案所述]。

答案 1 :(得分:3)

我想答案取决于你的MongoSession代表一个工作单位。我使用过的大多数与数据库相关的类(主要是在ORM的上下文中,例如NHibernate或EF4)围绕着代表工作单元的上下文,实体和跟踪状态。工作单元的工作时间不应超过执行给定工作单元所需的时间,之后应该承诺或回滚单元。这意味着您应该使用RequestScope

如果您的MongoSession 一个工作单元,您可以在MVC会话的生命周期内保留它,在这种情况下SessionScope将是合适的。

答案 2 :(得分:0)

根据@shankbond上面的要求删除的问题

Dispos al不一定在您的主请求线程上同步执行,如人们可能认为的那样。

您可能希望在请求的适当阶段隐藏Block然后隐藏Dispose()(您将如何处理异常?)

在Ninject Tests中查看更多示例(严肃地说,看看 - 它们简短明了,当我第三次听到这个消息时,我并没有后悔!)

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