2012-05-10 38 views
3

我们有我们的第一个NHibernate项目进行得非常好。但是,我仍然没有掌握如何在我们的场景中管理会话和对象的完整画面。实体对象和NHibernate会话

所以,我们在一个持久对象模型中配置一个系统结构,存储在一个数据库中,使用NHibernate。

该系统由应用程序在服务进程中监视的物理设备组成。因此,在服务启动时,我们实例化服务中的Device对象,并根据从设备接口读取的数据更新其状态。对象模型在服务的生命周期中保持活动状态。

该服务还提供Silverlight客户端,该客户端显示对象数据并可能操纵某些对象。但是它们必须访问服务用于监视的相同对象,例如,因为对象也具有内存数据,这些数据也不会被保留。 (是的,我们使用DTO对象实际上将数据传输到客户端。)

由于该服务是一个多线程系统,所以问题是如何管理NHibernate会话。

我现在正在考虑一种方法,我们只需要一个后台线程来处理后台中的对象持久化,其他线程将“SaveRequests”放到我们的Repository中,而不是直接访问NHibernate会话。通过这种方式,我可以为服务使用单个会话并管理与访问对象的服务和客户端完全分离的NHibernate层。

我还没有找到这样的设置的任何文档,因为每个人都建议每会话请求模型或一些变化。但是,如果我正确地做到了,如果我在一个会话中实例化一个对象并将它保存在另一个会话中,它不是同一个对象 - 并且NHibernate似乎也会在数据库中创建一个新条目。

我也试图找出IOC容器在这种情况下的角色,但我还没有找到任何有用的例子来证明他们真的可以帮助我。

我在正确的轨道上,还是应该如何继续?

回答

2

考虑ISession是一个工作单元。您将需要在应用程序的上下文中定义构成工作单元的内容。工作单元是围绕一系列较小操作的边界,这些操作构成了一个完整的功能性任务(在您的应用程序的设计中,完成和功能由您定义)。您的服务是否响应Silverlight客户端请求或其他外部请求?服务是否醒来在计时器上做一些工作?上述所有的?

您希望为该工作单元创建会话,并在完成时进行处理。不建议您使用长时间运行的ISession实例,其中操作懒惰地使用他们可以找到的任何环境ISession。

的想法通常被描述为这样:

  1. 我需要做一些工作(因为我响应事件,无论是传入的请求,在计时器的工作,这不是”问题)。
  2. 因此,我需要开始一个新的工作单元(这可以帮助我跟踪在执行这项工作时需要做的所有操作)。
  3. 工作单元开始一个新的ISession来跟踪我的工作。
  4. 我做我的工作。
  5. 如果我能成功完成工作,我所有的更改都应该刷新并提交
    1. 如果没有,请将所有更改回滚。
  6. 自己清理(处置ISession等)。
+0

是的,我已经考虑过了。但是因为我的对象“永远”活着,我认为UnitOfWork也应该永远活着。或者,我如何将一个会话中的更改始终与服务会话中活动的对象关联起来?主界面不是客户端,而是跟踪系统状态的服务应用程序,同时我们在对象中也有实时数据(例如状态和当前值)。 –

+0

我想不出任何情况下,你会想'活着的对象'的时间超过〜1秒... – Phill

+0

我们决定监视是基于追踪系统当前状态的对象,因为是主要部分。它们的配置一直存在,但不是现在的状态。 –