Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用Ninject和MongoDB使用单例vs瞬态vs请求_C#_Asp.net Mvc_Mongodb_Ninject_Norm - Fatal编程技术网

C# 何时使用Ninject和MongoDB使用单例vs瞬态vs请求

C# 何时使用Ninject和MongoDB使用单例vs瞬态vs请求,c#,asp.net-mvc,mongodb,ninject,norm,C#,Asp.net Mvc,Mongodb,Ninject,Norm,在global.cs文件中进行绑定时,我不太确定何时应该使用SingletonScope()vs TransientScope()vs RequestScope() 例如,我对MongoSession的调用(使用NoRM和mvcStarter项目)设置为SingletonScope,但我创建了一个存储库,使用此MongoSession对象使对Mongo的调用更容易,例如,我有一个NewsRepository,它使用MongoSession从数据中获取我的新闻项。例如,我有一个调用,它获取Disp

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

例如,我对MongoSession的调用(使用NoRM和mvcStarter项目)设置为SingletonScope,但我创建了一个存储库,使用此MongoSession对象使对Mongo的调用更容易,例如,我有一个NewsRepository,它使用MongoSession从数据中获取我的新闻项。例如,我有一个调用,它获取DisplayOnHome设置为true的新闻项,并通过CreationDate获取最新消息。这样的存储库应该是SingletonScope还是RequestScope更合适


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

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


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

通常在web应用程序中,您希望状态尽可能成为请求范围

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


同样,瞬态作用域是最直接的默认值(这就是为什么Ninject 2这么做的原因)——请求作用域应该只在出于性能等原因需要共享某些内容时出现(或者因为这只是共享的上下文[如另一个答案中所述]).

根据@shankbond的要求从删除的问题中删除


disp
al不一定像人们可能认为的那样在主请求线程上同步执行

您可能希望先将
隐藏起来,然后在请求的适当阶段将其处置(如何处理异常?)

看看Ninject测试中的更多例子(说真的,去看看吧——它们又短又清晰,当我第三次听的时候我并不后悔!)


请参见

Ok这是一个很好的描述,因此我应该在大部分时间使用RequestScope,但是为什么Rob在MVC初学者项目中使用SingletonScope作为MongoSession?如果
MongoSession
是线程安全的(如果它不维护任何状态,那么肯定是这样),singleton是可以的[但其他两个也可以工作]。只有当您想要共享某些东西时才需要使用单例(如果构建实例的成本很高,这可能有助于提高性能)。如果满足了所有的“依赖”位(线程安全、缓存状态永远不需要转储、从多个线程高效使用等),那么保持内容的长寿命并从多个线程访问它可能没什么问题——这不是一个好的默认值。希望这能澄清一些。其他类型的应用程序呢?@Rushino这太开放了——你什么都没问。。。也许你可以问一个问题,解释一下你在做什么样的应用,哪些对象需要是长期的还是短期的。e、 g.您是否维护针对特定服务器的会话,但也提供断开连接然后连接到另一个服务器的选项等。另请参见:(在我的回答中有人决定将其删除,因此不确定是否相关)@rubenbarterink请更新链接。该问题已被提问者删除,并添加以下答案