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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

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

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

谢谢,马塞洛

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top