Castle Windsor的Inteceptor机制是否被认为是实施工作单元模式的好/有效方式?
我的项目涉及Castle Windsor,NHibernate Facility以及NHibernate - 所有这些都用于自托管WCF服务。
每个服务方法通常从Windsor容器请求一个辅助类的实例,WCF调用被委托给该辅助类。辅助类有一个ISessionManager构造函数参数,Windsor通过NHibernate工具解析。
问题是,帮助者类做了太多工作。它具有混合的逻辑和数据访问,这意味着难以(几乎不可能)测试和难以阅读。
我想要的是重新安排责任
我不希望WCF助手知道有关事务或会话的任何信息,因此没有ISessionManager构造函数arg,没有对事务的引用,也没有ISession。
为了让WCF帮助程序进行数据访问,它必须依赖新的帮助程序,我敢称之为DAO吗?或者上帝禁止使用存储库,其中包括获取,查询和可能保存域对象的方法。
从DAO返回NHibernate代理对象的问题是,如果会话在返回实体之前关闭,那么从客户端代码访问域对象上的集合的任何后续尝试都将导致异常,因为会话为no更长时间用于懒惰地获取所需数据。这显然是真的,但NHibernate的每个人都必须遇到这个问题。
因此,如果DAO和Repos无法关闭会话,那会是什么?
我需要的是每个WCF服务操作调用一个NHibernate会话,其中几个DAO或Respositories可以根据需要调用OpenSession,但它们都获得相同的会话,理想情况下,任何处理会话的尝试都将被忽略除非是最后的Dispose。不确定最后一点,但也许DAO和repos只需调用ISessionManager.OpenSession并将其留给其他东西来刷新和处理会话。
我想也许我可以使用拦截器接受ISessionManager,打开会话并启动事务,转发调用,然后如果没有异常发生,则提交事务并处理会话,否则如果有任何异常则回滚事务发生。
有什么想法吗?
答案 0 :(得分:1)
所以如果DAO和Repos无法关闭 会话,什么做?会话,做什么?
服务拥有工作单位,而不是DAO。它们标志着工作单位。
Spring使用AOP管理交易,因此对我来说,拦截器对于交易管理来说是一个不错的选择。
就会话而言,这些是UI概念,因此它应该是打开会话的Web或桌面UI控制器,编组服务以完成用例,并在会话结束时关闭会话。
答案 1 :(得分:1)
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