您需要一个会话管理策略,让您的应用程序有效地运行并利用 NHibernate 为您提供的东西 - 最值得注意的是缓存和延迟加载。
创建会话是一个成本低廉的过程,并且需要很少的前期 RAM 或 CPU,因此您不必担心保存或重复使用会话(实际上,重复使用它们会导致一些令人讨厌的和未预料到的副作用)。会话工厂是昂贵的东西,应该在应用程序启动时构建一次且仅一次。
经验法则是这样的:会话生命周期需要足够长,以至于会话结束后您没有持久的对象在范围内徘徊。
会话结束后,您从该会话获得的对象的所有更改跟踪都会停止,因此除非您故意将该对象重新附加到新会话,否则不会保存这些更改。因此,只要您从中获取的对象存在,该会话就应该存在。在 Web 应用程序中,这通常意味着每个请求都有一个会话;在 WinForms 中,每个表单都有一个会话。
在您的情况下,使用服务(我假设它作为Windows 服务运行)执行 NHibernate 工作,您可能希望考虑为来自消费桌面应用程序的每个新请求创建一个会话,并在该请求得到服务时处理它. 不知道您的服务是如何运行的,以及桌面应用程序使用什么机制与之交谈(远程处理?WCF?普通的旧 SOAP?)我真的不能更具体。
(此一般规则有一些例外情况 - 假设您有一组持久对象,它们表示其他代码将引用但不会更改的共享资源,您可以在应用程序启动时预先加载这些对象,然后让它们断开连接在。)
如果您发现在这种策略下性能低下,可能是您与数据库的对话过多并且您的对象图很复杂;在这种情况下查看二级缓存。