gpt4 book ai didi

c# - 实体对象和 NHibernate session

转载 作者:行者123 更新时间:2023-11-30 17:12:38 25 4
gpt4 key购买 nike

我们的第一个 NHibernate 项目进展顺利。但是,我仍然没有掌握如何在我们的场景中管理 session 和对象的全貌。

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

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

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

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

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

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

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

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

最佳答案

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

您希望为该工作单元创建 session ,并在它完成时处理。不建议您使用长时间运行的 ISession 实例,在这种情况下,操作会懒惰地使用它们可以找到的任何环境 ISession。

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

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

关于c# - 实体对象和 NHibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10529968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com