12

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

4

4 回答 4

11

Ayende 最近在 MSDN 上写了一篇关于这个主题的精彩文章

于 2009-12-08T13:56:50.440 回答
3

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

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

另一方面,一旦用户选择该记录进行查看/编辑,并且您进入对象的多页详细信息视图,这就是我们对特定对象应用延迟加载的时候。数据现在是延迟加载的,具体取决于仅按需查看的详细信息。这样,我的会话为延迟加载打开的范围仅在使用详细信息视图时持续。

于 2008-09-18T06:42:05.903 回答
2

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

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

于 2008-09-18T06:51:29.390 回答
0

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

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

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

谢谢, 马塞洛

于 2009-04-19T08:25:55.267 回答