2010-07-16 74 views
2

我看到有2分可能的情况作为对会话处理:每次请求如何处理ASP.NET WebForms应用程序中的NHibernate会话?

  1. 打开一个单一的Isession。在请求开始时打开它并在请求结束时关闭它。
  2. 按概念“工作单元”打开一个ISession。为请求创建了许多会话。

方法#1是我现在正在做的。我有点担心,因为虽然它有效,但调试有点困难。例如,我有一个对象没有被保存(即使我命令它),而且我在调试时遇到了麻烦,因为在完整的请求生命周期中发生了很多事情。

方法#2似乎是标准的最佳实践(不确定关于ASP.NET),我相信调试起来更容易。我看到的问题是关于会话间通信。例如:My Page类持有对用户的引用,这是一个持久对象。许多操作接收用户作为参数。由于用户属于不同的会话,因此我无法将其作为参数传递。

我偏向于#2,但我不知道这是否是最佳做法,也不知道如何处理跨会话对象。

谢谢。

+0

为什么很难调试? – Paco 2010-07-16 11:58:19

回答

1

大多数人会为了简单起见而进行Session-Per-Request。

但是,您可以为每个“工作单元”打开并提交事务。因此,每个会话都会有很多交易。 (通常的做法是确保事务提交时,会话同时被刷新)。

例如,点击保存按钮后,打开并提交一个事务。

会议将负责跟踪您的所有实体。必要时,事务将负责清理数据库。

使用此设置,应该更容易调试您的问题。

0

您可能会发现NHibernate Burrow对此有帮助,或至少对此感兴趣,因为它旨在帮助ASP .NET应用程序中的会话管理,实现跨多个请求的“长时间运行对话”的概念。

1

对于我正在处理的ASP.NET项目,我使用了这些方法的组合。

我在请求开始时打开一个ISession,并在请求结束时关闭它,就像您使用第一种方法一样,并使用会话加载任何需要保持连接到会话的实体请求的持续时间。然而,当我需要保存,更新或删除一个实体时,我创建一个新的瞬态对象,并将它交给一个新的ISession,与绑定请求的ISession分开。对于额外的工作单元,我创建了额外的会话。

0

我认为你真正的问题是为什么不能让我的对象保存。

即使想你使用的是单一的ISession你仍然需要可以刷新会话或部分保存/更新提交事务/删除被COMMITED行动。

相关问题