WCF中每次调用的NHibernate会话 - 如何回滚

时间:2010-05-10 21:04:28

标签: wcf nhibernate session transactions rollback

我已经实现了一些组件,以便将WCF与IoC容器(StructureMap)和Session per Call模式一起使用。 NHibernate的东西最多来自这里:http://realfiction.net/Content/Entry/133

似乎没问题,但是我想在每次调用时打开一个事务并在最后提交,而不仅仅是Flush(),它是如何在文章中完成的。

这是我遇到一些问题并可以使用一些建议的地方。我还没有找到一个很好的回滚方法。我意识到我可以检查CommunicationState,如果有异常,则回滚,如下:

public void Detach(InstanceContext owner)
{
    if (Session != null)
    {
        try
        {
            if(owner.State == CommunicationState.Faulted)
                RollbackTransaction();
            else
                CommitTransaction();
        }
        finally
        {
            Session.Dispose();  
        }
    }
}

void CommitTransaction()
{
    if(Session.Transaction != null && Session.Transaction.IsActive)
        Session.Transaction.Commit();
}

void RollbackTransaction()
{
    if (Session.Transaction != null && Session.Transaction.IsActive)
        Session.Transaction.Rollback();
}

但是,我几乎从不通过服务电话返回故障状态。我通常会处理异常并在我的响应对象上返回一个适当的指示器并自行回滚该事务。

我能想到处理这个问题的唯一方法是不仅将存储库注入我的WCF服务,还注入ISession,这样我就可以回滚并处理我想要的方式。这不适合我,似乎有点漏水。

处理同样问题的其他人?

1 个答案:

答案 0 :(得分:0)

经过进一步考虑后,处理这个问题的唯一方法就是将ISession注入我的服务中。会话是注入我所有存储库的会话,并且因为WCF服务是应用服务,所以我认为允许我的服务来管理事务并不是真的漏洞或坏。实际上,这就是应用程序服务的整个目的 - 在基础架构和域之间进行协调。

使用本文http://realfiction.net/Content/Entry/133中的技术仍然可以获得很多好处,我只是不打算实现自动事务启动/提交/回滚。