1

我已经实现了一些组件以将 WCF 与 IoC 容器 (StructureMap) 和每次调用的会话模式一起使用。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,这样我就可以回滚并以我想要的方式处理。这对我来说并不好,而且似乎有点漏水。

还有其他人处理同样的问题吗?

4

1 回答 1

0

经过进一步考虑,似乎处理此问题的唯一方法是将 ISession 注入我的服务。该会话与注入到我所有存储库中的会话相同,并且由于 WCF 服务是一种应用程序服务,因此我认为允许我的服务管理事务并不是真正的泄漏或坏事。事实上,这就是应用服务的全部目的——在基础设施和领域之间进行协调。

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

于 2010-05-11T14:14:02.383 回答