当我在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为什么这样做的原因) - 请求范围只应在出于性能原因需要共享某些事物时才会进入等式(或者因为这仅仅是上下文)共享[如另一个答案中所述]).