Сессия NHibernate за вызов в WCF - как сделать откат - PullRequest
1 голос
/ 11 мая 2010

Я реализовал некоторые компоненты для использования 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 голосов
/ 11 мая 2010

После дальнейшего рассмотрения кажется, что единственный способ справиться с этим - внедрить ISession в мою службу. Сеанс один и тот же, внедренный во все мои репозитории, и, поскольку служба WCF является службой приложений, я решил, что не очень сложно или плохо разрешить моей службе управлять транзакциями. Фактически, в этом и заключается вся цель службы приложений - координация между инфраструктурой и доменом.

Я все еще получаю много преимуществ от использования методов, описанных в этой статье http://realfiction.net/Content/Entry/133, Я просто не собираюсь реализовывать автоматический запуск / принятие / откат транзакции.

...