我已经看到很多关于NHibernate会话管理的类似问题(所以我知道我并不孤单)但是没有解决方案来解决从其他层抽象会话管理的细节。
简单来说,我有一个Domain层,它包含Customer,Product和Order等对象。我有一个Integration层,它定义了应用程序的服务,如IOrderEntryService,包含Get< Product>(int id)或Get< Customer>(int id)和Get< Order>(int id)等方法。我有一个业务规则层,它使用这些服务来获取客户,订单等。业务规则仅使用服务接口来避免对任何特定服务实现的硬依赖。
我可以使用NHibernate实现IOrderEntryService并定义映射以支持诸如Customer.Orders之类的属性以及使用延迟加载的Order.Customer和类似关联。在我的Get< Customer>(int id)的实现中,我打开一个ISession对象,获取一个Customer然后处理我的ISession。稍后,如果我引用Customer.Orders,我会收到一个异常,因为当前没有会话。我理解这个的原因,但是我很难找到一个没有将更高层绑定到NHibernate的解决方法。我发现的所有示例都建议了每个请求获取NHibernate.ISession的方法,以便会话在完整的请求生存期内保持打开状态。我很挣扎,因为这会将更高层绑定到NHibernate ISession对象。
是否有一种抽象的方法来管理不会将更高层绑定到NHibernate的“会话”?
答案 0 :(得分:1)
我建议你使用一个能够像Spring.Net一样以“隐式方式”管理事务的框架。
它将管理“开放”,“关闭”,“提交”或“回滚”“ISession”/“交易”的会话。
关于您的问题:我认为没有办法让会话保持打开状态(在演示文稿渲染期间),而无需对更高层的ISession进行部分管理。
在高层上保持对ISession的管理是没有问题的,只要[管理ITransaction]不受其限制。
使用“Spring.Net”,您可以使用:[Transaction]
和[Transaction(ReadOnly = true)]
在您喜爱的图层上执行“IT管理”。
答案 1 :(得分:1)
您应该检查Sharp architecture和敏锐的architecture lite项目。他们都对如何在基于Web的系统中使用nhibernate有了深刻的理解。它们甚至为您提供了其他方法的背景知识,如IoC容器,DDD,TDD等。