nHibernate w / ASP.NET Session Per Request和Active Work Item

时间:2014-07-31 13:04:22

标签: asp.net-mvc session nhibernate fluent-nhibernate

我正在使用nhibernate构建一个ASP.NET应用程序,并且我按请求架构实现了会话。每个请求我打开一个会话,使用它,然后关闭它。我在几个视图中使用一个大对象,我将对象存储在用户会话缓存中,因此它在几个不同的页面上维护它们的状态。用户不希望必须在每个页面上保存他们的更改,他们希望能够在几个页面之间进行更改,然后将它们提交给数据库。除了当用户试图触发一个触发代理对象延迟加载的页面(由于每个请求的会话设计在前一个请求中关闭nhibernate会话而失败)时,这种方法很有效。我知道转动延迟装载可以解决它;但是,由于在其他领域会导致性能问题,这不是一种选择。我已经尝试根据请求设计更改会话,但没有运气,因为我不知道它何时是"安全"关闭nhibernate会话。

有没有其他人做过与此类似的事情或有任何建议?

提前致谢!

1 个答案:

答案 0 :(得分:0)

保留用户会话中的任何对象 - 服务器会话,服务器资源不是最好的方法。试想一下,你的应用程序会非常成功......而且会有很多用户...因此很多会话=多种资源。

我建议(基于一些经验),尝试重新思考架构以避免会话。极端的是去单页应用程序...但是甚至在几页之间的导航过程中有一些异步......"会更好。

所有这一切都意味着:

  • 我们将数据传递给客户端(带有渲染视图的标准ASP.NET MVC方式或一些Web Api JSON)
  • 如果需要,我们将数据发送回服务器(表单绑定或格式化JSON)

在这些情况下,标准的NHiberante会话将起作用。为什么?因为我们重新加载并重新分配了#34;标准NHibernat基础设施的对象。这就是我建议去的方式......

但是如果你想按照自己的方式行事,那么一定要检查NHibernate的合并功能:

一些引用:

  

在具有单独业务层的应用程序中,业务逻辑必须"准备"返回之前Web层所需的所有集合。这意味着业务层应该加载所有数据并将已初始化的所有数据返回到特定用例所需的表示/ Web层。通常,应用程序为Web层中需要的每个集合调用NHibernateUtil.Initialize()(此调用必须在会话关闭之前进行),或者使用带有FETCH子句或FetchMode.Join的NHibernate查询来急切地检索集合。在ICriteria。如果采用Command模式而不是Session Facade,这通常会更容易。

     

在访问未初始化的集合(或其他代理)之前,您还可以使用Merge() Lock()将以前加载的对象附加到新的ISession。不,NHibernate没有,当然不应该自动执行此操作,因为它会引入临时事务语义!