我们的第一个NHibernate项目进展顺利。但是,我还没有完全了解如何在我们的场景中管理会话和对象。
因此,我们在持久对象模型中配置系统结构,使用NHibernate存储在数据库中。
系统由物理设备组成,应用程序在服务过程中监视这些设备。因此,在服务启动时,我们在服务中实例化Device对象,并根据从设备接口读取的数据更新其状态。对象模型在服务的生命周期内保持活动状态。
该服务还为Silverlight客户端提供服务,这些客户端显示对象数据并且还可以操作某些对象。但是,它们必须访问服务用于监视的相同对象,例如,因为对象也具有内存数据,这些数据不会持久存在。 (是的,我们使用DTO对象实际将数据传输到客户端。)
由于该服务是一个多线程系统,问题是如何管理NHibernate会话。
我现在正在考虑一种方法,我们只有一个后台线程,它将在后台处理对象持久性,而其他线程只是将“SaveRequests”放到我们的Repository中,而不是直接访问NHibernate会话。通过这种方式,我可以使用单个会话进行服务,并将NHibernate层与访问对象的服务和客户端完全分开。
我没有找到任何关于此类设置的文档,因为每个人都在建议每个请求的会话模型或某些变体。但是如果我做对了,如果我在一个会话中实例化一个对象并将其保存在另一个会话中,那么它就不是同一个对象 - 而且NHibernate似乎也会在数据库中创建一个新条目。
我也试图在这种情境中找出IOC容器的作用,但我没有找到任何有用的例子来表明他们真的可以帮助我。
我是在正确的轨道上还是应该如何进行?
答案 0 :(得分:2)
将ISession视为一个工作单元。您需要在应用程序的上下文中定义构成工作单元的内容。工作单元是围绕一系列较小操作的边界,这些操作构成完整的功能性任务(完整和功能由您在应用程序的设计中定义)。是您的服务响应Silverlight客户端请求还是其他外部请求?服务唤醒时是否在计时器上做了一些工作?以上所有?
您希望为该工作单元创建会话,并在完成时将其处理。不建议您使用长时间运行的ISession实例,其中操作可以懒惰地使用它们可以找到的任何环境ISession。
这个想法通常被描述为: