【问题标题】:Castle Windsor Interceptor and Unit Of Work温莎城堡拦截器和工作单元
【发布时间】:2010-09-16 09:39:54
【问题描述】:

Castle Windsor 的 Inteceptor 机制是否被认为是实施工作单元模式的好/有效的方式?

我的项目涉及 Castle Windsor、NHibernate 设施,当然还有 NHibernate - 都用于自托管 WCF 服务。

每个服务方法通常都从 Windsor 容器请求一个助手类的实例,WCF 调用委托给该实例。辅助类有一个 ISessionManager 构造函数参数,Windsor 通过 NHibernate 工具解析。

问题是,辅助类做了太多的工作。它混合了逻辑和数据访问,这意味着它很难(几乎不可能)测试和阅读。

我想要的是重新安排职责

我不希望 WCF 帮助程序了解有关事务或会话的任何信息,因此没有 ISessionManager 构造函数参数,没有对事务的引用,也没有 ISession。

为了让 WCF 助手进行数据访问,它必须依赖一个新的助手,我敢称它为 DAO 吗?或者上帝禁止存储库,其中将包含用于获取、查询和可能保存域对象的方法。

从 DAO 返回 NHibernate 代理对象的问题是,如果会话在返回实体之前关闭,任何后续尝试从客户端代码访问域对象上的集合都将导致异常,因为会话没有更长的时间用于懒惰地获取所需的数据。这确实很明显,但是每个 NHibernate 新手都必须解决这个问题。

如果 DAO 和 Repos 无法关闭会话,该怎么办?

我需要的是每个 WCF 服务操作调用一个 NHibernate 会话,其中多个 DAO 或存储库可以尽可能多地调用 OpenSession,但它们都获得相同的会话,理想情况下,任何处置会话的尝试都将被忽略除非它是最后一次 Dispose。不确定最后一点,但也许 DAO 和 repos 只是调用 ISessionManager.OpenSession 并将其留给其他东西来刷新和处理会话。

我想也许我可以使用一个拦截器,它接受一个 ISessionManager,打开一个会话并启动一个事务,转发调用,然后如果没有发生异常,则提交事务并处理会话,否则如果有任何异常则回滚事务发生。

有什么想法吗?

【问题讨论】:

    标签: nhibernate castle-windsor


    【解决方案1】:

    因此,如果 DAO 和 Repos 无法关闭 会话,做什么?会话,做什么?

    服务拥有工作单元,而不是 DAO。他们划分了工作单元。

    Spring 使用 AOP 管理事务,所以对我来说,拦截器听起来是一个不错的选择。

    就会话而言,这些都是 UI 概念,因此应该是 Web 或桌面 UI 控制器打开会话、编组服务以实现用例,并在会话完成时关闭会话。

    【讨论】:

      【解决方案2】:

      Castle.Service.Transactions 还与城堡堆栈的其余部分很好地联系在一起,并允许您使用 AOP 来处理事务。

      看看 v3! https://github.com/haf/Castle.Services.Transaction

      还有那里的维基!

      我还创建了一个新的 NHibernate 设施:

      https://github.com/haf/Castle.Facilities.NHibernate/wiki/NHibernate-Facility---Quick-Start

      【讨论】:

      • 谢谢,这似乎值得一看;我会调查的。
      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多