【问题标题】:Entity objects and NHibernate sessions实体对象和 NHibernate 会话
【发布时间】:2012-05-10 08:14:36
【问题描述】:

我们的第一个 NHibernate 项目进展顺利。但是,我还没有完全理解如何在我们的场景中管理会话和对象。

因此,我们在持久对象模型中配置系统结构,并使用 NHibernate 存储在数据库中。

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

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

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

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

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

我也试图弄清楚 IOC 容器在这种情况下的作用,但我没有找到任何有用的例子来证明它们真的可以帮助我。

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

【问题讨论】:

    标签: c# silverlight nhibernate entity


    【解决方案1】:

    将 ISession 视为一个工作单元。您需要在应用程序的上下文中定义什么构成工作单元。工作单元是围绕一系列较小操作的边界,这些操作构成完整的功能性任务(完整和功能性由您在应用程序设计中定义)。是在您的服务响应 Silverlight 客户端请求还是其他外部请求时?是在服务唤醒以在计时器上做一些工作的时候吗?以上都是?

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

    这个想法一般是这样描述的:

    1. 我需要做一些工作(因为我正在响应一个事件,无论是传入请求还是计时器上的作业,都没有关系)。
    2. 因此,我需要开始一个新的工作单元(这有助于我跟踪执行此工作时需要执行的所有操作)。
    3. 工作单元开始一个新的 ISession 来跟踪我的工作。
    4. 我做我的工作。
    5. 如果我能够成功完成我的工作,我的所有更改都应该刷新并提交
      1. 如果没有,请将我的所有更改回滚。
    6. 自行清理(处理 ISession 等)。

    【讨论】:

    • 是的,我已经考虑过了。但由于我有“永远”活着的对象,我认为 UnitOfWork 也应该永远活着。或者我如何将一个会话中的更改与服务会话中一直存在的对象相关联?主界面不是客户端,而是跟踪系统状态的服务应用程序,我们在对象中也有实时数据(例如状态和当前值)。
    • 我想不出任何你想让“对象活着”超过 ~1 秒的场景......
    • 我们决定监控基于跟踪系统当前状态的对象,因为这是主要部分。他们的配置是持久化的,但不是当前的一般状态。
    • 是的,所以该对象不应该是持久性的一部分,因此不应该是 NHibernate 会话的一部分。
    • 只要系统在它们上面运行,它们就应该被认为是“活着的”。如果不是,它们就已经死了,应该被收集起来并扔掉。下次需要它们时,您可以随时重新加载它们。如果您担心性能,请考虑 NHibernate 支持的 2 级缓存。此缓存将对 ISessionFactory 创建的所有会话可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-04-08
    • 2010-10-13
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多