【问题标题】:Proper session (RavenDB/NHibernate) disposal - IoC and web app适当的会话(RavenDB/NHibernate)处置 - IoC 和 Web 应用程序
【发布时间】:2012-08-29 19:18:05
【问题描述】:

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

现在,我的问题是关于处置。我已经阅读了许多介绍不同方法的文章。有些人在控制器中执行此操作,有些在存储库中,有些在 http 模块中,其他人在 Application_EndRequest() 处理程序中执行此操作。批评的范围从违反 SRP 到“创建对象的人应该负责其处置”等等。

所以底线是:

  • 常见的方法是手动处理这些会话 - 为什么?我已经配置了我的容器来管理特定对象的生命周期。它不应该(即 IoC)为我管理吗?
  • 没有可供处置的选项是用Application_EndRequest() 处理它的“最佳”方式吗?

例如,this article 详细解释了一种可用的方法,但文章本身已超过 2.5 年。也许新版本的 StructureMap 会使大部分实现过时?

【问题讨论】:

  • StructureMap 应该在 HTTP 请求结束时处理会话,这是该生命周期的目的。这相当于在 Application_EndRequest 中处理会话。
  • @eulerfx :你确定是这样吗?所以,我所要做的就是将 Session 传递给我的控制器,对数据做任何我必须做的事情,调用 SaveChanges 并退出,对吗? StructureMap 会做剩下的事情吗?在阅读了其他人在控制器、存储库、模块等中手动处理会话后,我不太确定。有没有办法验证这一点?
  • @Steven - 非常好的文章。谢谢。我在那里投票赞成你的答案!
  • 我没有使用过 StructureMap,所以我不能确定,但​​这是 IoC 容器的工作 - 处理组件,所以我猜应该这样做。

标签: nhibernate structuremap ravendb isession


【解决方案1】:

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

【讨论】:

  • 这很清楚。我在配置DocumentStore(单例)和DocumentSession(每个请求)时没有问题。我的问题是关于如何在工作完成后正确处置DocumentSession
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多