正确的会话(RavenDB/NHibernate)处理-IoC和web应用程序

正确的会话(RavenDB/NHibernate)处理-IoC和web应用程序,nhibernate,structuremap,ravendb,isession,Nhibernate,Structuremap,Ravendb,Isession,我使用的是StructureMap,我已将ISession配置为HybridHttpOrLocalThreadStorage生命周期。根据每个请求创建新会话并将其注入控制器 现在,我的问题是关于处置。我读过很多文章,介绍了许多不同的方法。有些人在控制器中执行,有些人在存储库中执行,有些人在http模块中执行,还有一些人在Application\u EndRequest()handler中执行。批评的范围从违反SRP到“创建对象的人应负责其处置”等等 因此,底线是: 常见的方法是手动处理这些会话

我使用的是StructureMap,我已将ISession配置为
HybridHttpOrLocalThreadStorage
生命周期。根据每个请求创建新会话并将其注入控制器

现在,我的问题是关于处置。我读过很多文章,介绍了许多不同的方法。有些人在控制器中执行,有些人在存储库中执行,有些人在http模块中执行,还有一些人在
Application\u EndRequest()
handler中执行。批评的范围从违反SRP到“创建对象的人应负责其处置”等等

因此,底线是:

  • 常见的方法是手动处理这些会话-为什么?我已经将容器配置为管理特定对象的生命周期。难道它(即国际奥委会)不应该为我管理它吗
  • 可供处置的选项中没有一个是用
    应用程序\u EndRequest()
    处理它的“最佳”方式

例如,在篇幅上解释了一种可用的方法,但文章本身已有2.5年的历史。也许新版本的StructureMap会使大部分实现过时

如果您使用的是RavenDB.net客户端,那么您将使用DocumentStore和DocumentSession。这两个对象都在后台做了大量的工作;本地缓存需要提到一件事。为了保持整洁和高效,每个会话都应该在工作完成时调用session.dispose()。应用程序结束时应调用documentStore.Dispose()

StructureMap应该在HTTP请求结束时处理会话,这是该生命周期的目的。这相当于在Application_EndRequest.Related:@eulerfx:中处理会话。是否确实如此?所以,我所要做的就是将会话传递给我的控制器,对数据做任何我必须做的事情,调用
SaveChanges
并退出,对吗?StructureMap会做剩下的吗?在阅读了其他人在控制器、存储库、模块等中手动处理会话的文章后,我不太确定。有没有办法验证这一点?@Steven-非常好的文章。谢谢我把你的答案投了赞成票!我没有使用StructureMap,所以我不能确定,但这是IoC容器的工作——处理组件,所以我猜应该是这样。这一点非常清楚。我在配置
DocumentStore
(单例)和
DocumentSession
(每个请求)时没有问题。我的问题是如何在其工作完成后正确处理
DocumentSession