1

我见过许多关于 NHibernate 会话管理的类似问题(所以我知道我并不孤单),但没有解决从其他层抽象会话管理细节的答案。

简单来说,我有一个域层,其中包含客户、产品和订单等对象。我有一个集成层,它为应用程序定义服务,如 IOrderEntryService,其中包含 Get<Product>(int id) 或 Get<Customer>(int id) 和 Get<Order>(int id) 等方法。我有一个业务规则层,它使用这些服务来获取客户、订单等。业务规则仅使用服务接口来避免对任何特定服务实现的硬依赖。

我可以使用 NHibernate 实现 IOrderEntryService 并定义映射以支持诸如 Customer.Orders 以及 Order.Customer 等属性以及使用延迟加载的类似关联。在我的 Get<Customer>(int id) 实现中,我打开一个 ISession 对象,获取一个客户,然后处置我的 ISession。稍后,如果我引用 Customer.Orders,我会收到一个异常,因为没有当前会话。我理解这样做的原因,但我很难找到一种不将更高层绑定到 NHibernate 的解决方法。我发现的所有示例都建议了为每个请求获取 NHibernate.ISession 的方法,以便会话在整个请求生命周期内保持打开状态。我为此感到挣扎,因为这会将更高层绑定到 NHibernate ISession 对象。

是否有一种抽象的方式来管理不将更高层绑定到 NHibernate 的“会话”?

4

2 回答 2

1

您应该检查Sharp architecture和 sharp architecture lite项目。他们都对如何在基于 Web 的系统中使用 nhibernate 提供了扎实的理解。更重要的是,它们为您提供了 IoC 容器、DDD、TDD 等其他方法的背景知识。

于 2012-09-12T06:53:58.773 回答
1

我建议您使用能够以“隐式方式”管理事务的框架,如 Spring.Net。

它将管理“打开”、“关闭”、“提交”或“回滚”“ISession's”/“事务”的会话。

关于您的问题:我认为如果不对较高层的 ISession 进行部分管理,就无法保持会话打开(在演示文稿呈现期间)。

保持对更高层的 ISession 的管理没有问题,只要 [对 ITransaction 的管理] 不受它们的影响。

使用“Spring.Net”,您可以使用:[Transaction][Transaction(ReadOnly = true)].

于 2012-09-11T23:47:55.037 回答