代码之家  ›  专栏  ›  技术社区  ›  Corey Coogan

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

  •  1
  • Corey Coogan  · 技术社区  · 16 年前

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

    在这里我遇到了一些问题,需要一些建议。我还没有想出一个好办法来回退。我知道我可以检查通信状态,如果有异常,回滚,如下所示:

    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 回复  |  直到 13 年前
        1
  •  0
  •   Corey Coogan    16 年前

    在进一步考虑之后,处理这个问题的唯一方法似乎是将ISession注入到我的服务中。会话与注入到我所有存储库的会话是相同的,因为WCF服务是一个应用程序服务,所以我决定允许我的服务管理事务并不是真正的泄漏或错误。事实上,这就是应用程序服务的全部目的——协调基础设施和域之间的关系。

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