我见过许多关于NHibernate会话管理的类似问题(所以我知道我并不孤单),但没有解决从其他层抽象会话管理细节的问题。
简单地说,我有一个域层,其中包含Customer、Product和Order等对象。我有一个集成层,它为应用程序定义服务,比如包含Get(int )或Get(int )和Get(int )方法的IOrderEntryService。我有一个业务规则层,它使用这些服务来获取客户、订单等。业务规则只使用服务接口来避免对任何特定服务实现的硬依赖。
我可以用NHibernate实现IOrderEntryService,并定义映射来支持像Customer.Orders这样的属性,以及使用延迟加载的Order.Customer和类似的关联。在我的Get(int )实现中,我打开了一个ISession对象,获取了一个客户,然后处置了我的ISession。稍后,如果我引用Customer.Orders,我会收到一个异常,因为没有当前会话。我理解这样做的原因,但我很难找到一种不将高层绑定到NHibernate的解决方案。我找到的所有示例都建议了获取每个请求的NHibernate.ISession的方法,以便会话在整个请求生命周期内保持打开状态。我很难做到这一点,因为这会将更高层绑定到NHibernate ISession对象。
有没有一种抽象的方法来管理“会话”,而不将更高层绑定到NHibernate?
发布于 2012-09-12 07:47:55
我建议您使用能够以“隐式方式”管理事务的框架,如Spring.Net。
它将管理会话进行“打开”、“关闭”、“提交”或“回滚”“ISession的”/“事务”。
关于你的问题:我认为如果不对更高层的ISession进行部分管理,就没有办法保持会话打开(在呈现期间)。
在更高的层上保持对ISession的管理是没有问题的,只要不对ITransaction进行管理。
有了"Spring.Net“,你可以在你最喜欢的层上使用:[Transaction]
和[Transaction(ReadOnly = true)]
对ITransaction进行”管理“。
发布于 2012-09-12 14:53:59
您应该检查Sharp architecture和夏普architecture lite项目。他们都对如何在基于web的系统中使用nhibernate提供了坚实的理解。更重要的是,它们为您提供了其他方法的背景知识,如IoC容器、DDD、TDD等等。
https://stackoverflow.com/questions/12379174
复制相似问题