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

C# 无需到处传递ISession的逻辑链接对象的NHibernate模式,c#,nhibernate,C#,Nhibernate,假设我有一个名为“Customer”的类,在该类上有一个方法是有意义的,如: void AddOrder(Item item, int quantity, decimal pricePerUnit) AddOrder方法在概念上会在数据库中创建新记录 从C#的角度来看,上面的方法签名没有问题,但出于NHibernate的目的,它需要访问ISession以将新对象保存到数据库中 在不使持久类上的每个方法都具有ISession参数的情况下,实现这一点的合适模式是什么 我应该从使用依赖注入接收当前I

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

void AddOrder(Item item, int quantity, decimal pricePerUnit)
AddOrder方法在概念上会在数据库中创建新记录

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

在不使持久类上的每个方法都具有ISession参数的情况下,实现这一点的合适模式是什么

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

这有好的模式吗

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


澄清:

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


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

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

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


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

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


编辑:听起来您希望对象立即持久化。我建议保持事务简短,而不是手动引用和刷新会话。虽然以后可以正确地执行此操作,但通常您会对ORM数据完整性带来的许多好处感到失望。

通过强制将所有更改立即保留到数据库,您否定了使用O/RM可以带来的许多好处。你能再澄清一点吗?如果您认为NHibernate在不重新设计轮子的情况下处理对象模型太复杂,我会有点担心您的对象模型。@Michael调用ISession.Save()不是我关心的问题。我更关心的是开发人员如何在他们的代码中与持久性模型交互,而不需要他们成为小“零碎”方面的专家。在上面添加一个示例进行澄清。我相信您正确地认为映射是唯一的方法。