.net 桌面应用程序中NHibernate的会话管理策略是什么?

.net 桌面应用程序中NHibernate的会话管理策略是什么?,.net,nhibernate,desktop-application,.net,Nhibernate,Desktop Application,我发现在桌面应用程序中管理会话要困难得多,因为您无法利用像HttpContext这样的清晰绑定。 那么,如何管理会话生存期,以利用延迟加载,但不为整个应用程序打开一个会话?我认为这归结于对象的设计。因为可以在每个对象级别强制执行延迟加载,所以在考虑会话管理时可以利用这一事实 例如,我有一堆数据丰富且延迟加载的对象,我有一个网格/摘要视图和它们的详细视图。在grid summary视图中,我不使用对象的延迟加载版本。我使用代理对象来表示该数据,并且该代理对象不是延迟加载的 另一方面,一旦用户选择该

我发现在桌面应用程序中管理会话要困难得多,因为您无法利用像HttpContext这样的清晰绑定。
那么,如何管理会话生存期,以利用延迟加载,但不为整个应用程序打开一个会话?

我认为这归结于对象的设计。因为可以在每个对象级别强制执行延迟加载,所以在考虑会话管理时可以利用这一事实

例如,我有一堆数据丰富且延迟加载的对象,我有一个网格/摘要视图和它们的详细视图。在grid summary视图中,我不使用对象的延迟加载版本。我使用代理对象来表示该数据,并且该代理对象不是延迟加载的


另一方面,一旦用户选择该记录进行查看/编辑,并且您输入了该对象的多页详细信息视图,则我们将延迟加载应用于特定对象。数据现在是延迟加载的,这取决于哪些细节只在需要时查看。这样,我的会话对延迟加载开放的范围仅在使用详细信息视图时持续。

如前所述,您不能使用HttpRequest的边界,但您可以理解桌面应用程序中的“HttpRequest”是什么


让我解释一下。通常,您的HttpRequest将是某个操作的控制器,并且您将会话限制为该特定操作。现在,在桌面应用程序中,“控制器”(事件)可以更小,但正如@Jon所说,一个窗口可以很容易地表示一个边界:你处理那里的东西,让它们在你的会话中。

也许我们可以考虑设置一个命令模式。每个有意义的事件都将提供并触发一个命令,并执行它。基本AbstractCommand.Execute()实现负责初始化会话、包装事务、调用具体的SomeCommand.\u Execute()实现并关闭所有内容

无论如何,这远不是持久性不可知论,当我加载了我的对象并且我(想要)只处理普通实例时(这里我特别指的是延迟加载),应该是这样的

是否有可能实现某种自动打开/自动关闭行为?这应该通过使持久性层对更高层的查询需求敏感来实现,即使在隐式情况下,如延迟加载触发器。至于关闭连接,持久层可能在给定的数据库不活动超时(10秒?)后关闭。 我知道,这不锋利。但它确实会使更高层次的持久性变得不可知

谢谢,
马塞洛最近写了一篇文章