【发布时间】: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,打开一个会话并启动一个事务,转发调用,然后如果没有发生异常,则提交事务并处理会话,否则如果有任何异常则回滚事务发生。
有什么想法吗?
【问题讨论】: