18

我有一段时间试图找出我在 NHibernate 中的会话管理问题。我假设我的很多麻烦是由于缺乏对 IoC 和 AOP 概念的了解;至少我是这么想的,法比奥·毛洛一直在指导我。

无论如何,我的问题是我有一个 win 表单应用程序,它正在进行“get”调用并将结果绑定到网格。绑定后,用户可能会执行某种“写入”操作,这些操作会导致会话在写入后关闭,以尝试使用会话每次使用的概念。然后用户可以滚动浏览导致延迟加载启动的网格,现在会话已经关闭,我得到一个异常。

我不想让我的视图认识到我的会话,我不想在用户关闭表单时发送 KillAllSessions。此外,用户可能在任何给定时间打开多个表单,这进一步加剧了与该方法相关的问题。我基本上希望所有这些都在“幕后”工作。

所以到目前为止我的想法是拦截延迟加载调用并检查会话是否打开,如果没有重新打开它,获取信息然后重新关闭它。但是,据我所知,这并不多,这基本上就是延迟加载的工作原理。它被代理工厂 (NHibernate.Bytecode.Castle) 拦截,然后使用会话检索数据。所以我需要实际拦截该调用,然后在重新打开会话后将其传递给最初的预期拦截。这就是我的想法。

我的问题基本上首先是这甚至是正确的方法吗?其次,如果是我什至不知道从哪里开始。我从来没有做过任何方法调用的拦截,我在理论上知道但在实践中不知道。我知道有一些图书馆可以做这种事情,比如 Rhino Commons,但我想借此机会学习并成为一名更好的程序员。我正在尝试理解 AOP 和上下文绑定对象,但目前我并没有理解它。你们中的一些人可以帮助一个人吗?

4

2 回答 2

8

我能想到几个选择:

选项 1:在用户与数据交互时保持原始 ISession 处于打开状态,并在用户完成后立即提交所有更改。这意味着您可能在内存中有大量未提交的更改,而其他用户将看不到待处理的更改。

选项 2:将操作拆分为两个工作单元 (UOW)。UOW1 只读取并负责填充列表。与 UOW1 关联的 ISession 保持活动状态以允许延迟加载,例如在向下钻取方案中。UOW2 是为用户编辑而创建的新的短期 ISession。当编辑提交时,原始对象会从 UOW1 中逐出,并且 UOW1 从数据库中获取新副本。

选项 3:在每次编辑提交后重新创建列表。这是最简单的解决方案,可能适用于小型数据集。

于 2009-06-23T23:29:48.673 回答
2

我正在开发一个类似的应用程序。我正在使用一个保持打开状态的会话。

每当我写入数据库时​​,我都会使用不会关闭底层会话的开始/提交事务。数据库连接仅在事务进行时由 NHibernate 打开。

在用户积极使用表单时,您是否需要关闭会话?

您能否提供有关您用于管理会话、存储库模式等的更多详细信息?

于 2009-06-25T14:17:24.013 回答