我有一段时间试图找出我在 NHibernate 中的会话管理问题。我假设我的很多麻烦是由于缺乏对 IoC 和 AOP 概念的了解;至少我是这么想的,法比奥·毛洛一直在指导我。
无论如何,我的问题是我有一个 win 表单应用程序,它正在进行“get”调用并将结果绑定到网格。绑定后,用户可能会执行某种“写入”操作,这些操作会导致会话在写入后关闭,以尝试使用会话每次使用的概念。然后用户可以滚动浏览导致延迟加载启动的网格,现在会话已经关闭,我得到一个异常。
我不想让我的视图认识到我的会话,我不想在用户关闭表单时发送 KillAllSessions。此外,用户可能在任何给定时间打开多个表单,这进一步加剧了与该方法相关的问题。我基本上希望所有这些都在“幕后”工作。
所以到目前为止我的想法是拦截延迟加载调用并检查会话是否打开,如果没有重新打开它,获取信息然后重新关闭它。但是,据我所知,这并不多,这基本上就是延迟加载的工作原理。它被代理工厂 (NHibernate.Bytecode.Castle) 拦截,然后使用会话检索数据。所以我需要实际拦截该调用,然后在重新打开会话后将其传递给最初的预期拦截。这就是我的想法。
我的问题基本上首先是这甚至是正确的方法吗?其次,如果是我什至不知道从哪里开始。我从来没有做过任何方法调用的拦截,我在理论上知道但在实践中不知道。我知道有一些图书馆可以做这种事情,比如 Rhino Commons,但我想借此机会学习并成为一名更好的程序员。我正在尝试理解 AOP 和上下文绑定对象,但目前我并没有理解它。你们中的一些人可以帮助一个人吗?