Nhibernate 温莎城堡拦截器和工作单元

Nhibernate 温莎城堡拦截器和工作单元,nhibernate,castle-windsor,Nhibernate,Castle Windsor,Castle Windsor的Inteceptor机制是否被认为是实施工作单元模式的良好/有效方式 我的项目涉及温莎城堡、NHibernate设施,当然还有NHibernate——所有这些都用于自托管WCF服务 每个服务方法通常从Windsor容器请求一个助手类的实例,WCF调用被委托到该类中。helper类有一个ISessionManager构造函数参数,Windsor通过NHibernate工具解析该参数 问题是,helper类做了太多的工作。它的逻辑和数据访问混合在一起,这意味着它很难(几

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

我的项目涉及温莎城堡、NHibernate设施,当然还有NHibernate——所有这些都用于自托管WCF服务

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

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

我想要的是重新安排责任

我不想让WCF助手知道任何关于事务或会话的信息,因此没有ISessionManager构造函数arg,没有对事务的引用,也没有ISession

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

从DAO返回NHibernate代理对象的问题是,如果在返回实体之前关闭了会话,则从客户端代码访问域对象上集合的任何后续尝试都将导致异常,因为会话不再用于延迟获取所需数据。这确实很明显,但每个新加入NHibernate的人都必须关注这个问题

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

我需要的是每个WCF服务操作调用一个NHibernate会话,其中多个DAO或Respository可以随意调用OpenSession,但它们都得到相同的会话,理想情况下,任何试图处理会话的尝试都将被忽略,除非是最后一次处理。不确定最后一点,但可能DAOs和repos只需调用ISessionManager.OpenSession并将其留给其他人来刷新和处理会话

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

有什么想法吗

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

服务拥有自己的工作单元,而不是DAO。他们标记工作单位

Spring使用AOP管理事务,所以我觉得拦截器是事务管理的好选择


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

Castle.Service.Transactions还与Castle堆栈的其余部分紧密结合,允许您使用AOP处理事务

看看v3!

还有那里的维基

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


谢谢,这似乎值得一看;我会调查的。