【问题标题】:How to use NHibernate in a layered architecture如何在分层架构中使用 NHibernate
【发布时间】:2012-09-04 22:36:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

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

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

    如果[对 ITransaction 的管理] 不受其影响,则在较高层上保持对 ISession 的管理是没有问题的。

    使用“Spring.Net”,您可以使用[Transaction][Transaction(ReadOnly = true)] 在您最喜欢的层上进行“ITransaction 管理”。

    【讨论】:

    • 管理事务不是问题,因为通常我的更新包含在单个更新中(Update、Insert 等)我的问题是管理更高级别的“会话”层。有意义的是,我需要获取某种 IDisposable 对象,并且只在我的更高层需要时才保留它。我宁愿那是不直接依赖于 NHibernate 的东西。这样,如果我的实现需要更改,或者需要使用可能未在 NHibernate 中实现的其他服务,我将能够这样做而不会破坏客户端..
    • @user734929 这不仅仅是关于交易。当您有方法 [Transaction] 时,Spring 会自动处理 Session。因此,如果您想,例如注释控制器方法(不知道您是否使用 MVC),您可以。实际上我不建议这样做,但如果你这样做,所有后续对 dao 的调用都将“嵌套”在第一个事务/会话上。我推荐的一点是在服务层内部,该服务层应该对模型对象执行一些原子操作,例如持久化订单。值得提醒的是,Spring 并不依赖 NHibernate。
    • Spring.NET 与 NHibernate 配合得非常好。我认为下载附带了一个名为“Northwind”的示例,它显示了您需要的内容(尽管我可能错了)。你最终会得到一个非常整洁的分层应用程序(DAO、服务、控制器),并且可以利用 Spring.NET 也允许你做的事务单元测试,这是一个非常强大的特性,即测试实际上写入一个真实的数据库然后在测试结束时回滚事务,以便您的数据库再次干净。正如 Hailton 所说,它就像定义一个事务管理器然后使用属性一样简单。
    • Plus Spring.NET 2 即将发布。不确定有什么新内容,但期待看到它。
    【解决方案2】:

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

    【讨论】:

    • 强烈推荐 Sharp 架构作为使用 nHibernate 和 Castle 的起点。即使您最终没有使用它,您也会对有多少人在使用您所描述的那种架构有一个宝贵的了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2011-01-10
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多