gpt4 book ai didi

c# - 逻辑链接对象的 NHibernate 模式,无需到处传递 ISession

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:30 25 4
gpt4 key购买 nike

假设我有一个名为“Customer”的类,并且在该类上有一个方法是有意义的:

void AddOrder(Item item, int quantity, decimal pricePerUnit)

AddOrder 方法在概念上会在数据库中创建新记录。

从 C# 的角度来看,上面的方法签名没有问题,但出于 NHibernate 的目的,它需要访问 ISession 以将新对象保存到数据库中。

在不使我的持久类上的每个方法都具有 ISession 参数的情况下,实现此目标的适当模式是什么?

我是否应该使用依赖注入(inject)从接收当前 ISession 实例的公共(public)抽象祖先继承我的持久类? (即为 ISession 实现一个瘦包装器,充当处理所有创建或获取请求的对象工厂)

有好的模式吗?

PS - 我知道我不想使用存储库模式。对于高度复杂的数据模型来说,它的形式过于自由。


澄清:

所讨论的数据模型是一个复式记账系统。大多数开发人员对复式记账机制的了解为零,他们也不想这样做。因此,我想做的是提供代码方法,向开发人员指示“我可以用这个对象做什么?”,而不是仅使用属性,这是正常的 NHibernate 方式。 p>

我现在已经在相当多的项目中使用了 NHibernate,我不断地得出结论,我真的应该将非常复杂的系统的所有数据交互都放在一个高度结构化的 API 后面,并且只有那些从事此工作的人该 API 的后端应该是数据/持久性模型方面的专家。只与数据交互的程序员只知道如何使用 API。这不是我真正想得出的结论,因为它会给我们的一些系统增加相当多的开发开销。 (当然,这是通向面向服务的架构的途径,现在对于大型项目来说可能只是“给定的”)

最佳答案

如果 Customer 是一个持久类,您将不需要访问 session 对象来添加新的 Item 记录。客户需要将集合属性 Items 映射为“具有多对多”关联,并将级联映射选项设置为“保存”或“全部”。

AddItem() 方法应该简单地将一个 Item 实例添加到 Customer 对象的 Items 集合中.一旦您提交了 NHibernate 事务(通常在操作过滤器、http 模块或其他一些基础设施类中完成),NHibernate 将保存所有记录。

如果Customer 是新实例化的类,您将必须调用当前ISession 实例的Save 方法。您还必须调用 Remove 方法来删​​除持久对象。

我通常会创建一个非常通用的简单 DAO 服务来添加/删除/获取 id 聚合根。级联和获取路径负责处理关联的对象。对于复杂的查询,您可以创建通过依赖注入(inject)访问 ISession 实例的查询对象。

编辑:听起来您希望对象立即保留。我建议保持事务简短而不是手动引用和刷新 session 。虽然以后可以正确地做到这一点,但通常您会失去很多 ORM 数据完整性的好处。

关于c# - 逻辑链接对象的 NHibernate 模式,无需到处传递 ISession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27002596/

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