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

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

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

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

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

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

在相同的基础上,瞬态范围是最直接的默认(这就是Ninject 2所做的那样) – 请求范围只应出于性能原因需要共享某些事物等等时(或者因为这仅仅是上下文)分享[如另一个答案所述])。

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

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

从@shankbond上面要求删除的问题


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

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

看看Ninject Tests中的更多例子(严肃地说,看看 – 它们很短而且清晰,当我第三次听到它时,我并没有后悔!)

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