我见过许多关于 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 的“会话”?