Неожиданное поведение во время UnitOfWork

Любые сообщения, отправляемые / публикуемые в обработчике сообщений, будут отправлены после подтверждения транзакции. (Это действительно хорошее поведение OOTB)

Я реализовал UnitOfWork для вашего примера. Обнаружено, что если исключение произошло внутри действия OnCommitted(action) сообщения в очереди могут быть отправлены, это зависит только от того, будет ли выполнена задача доставки до uow.commit() действие.

Я нашел обходной путь, добавив шаг процесса в конце конвейера приема. Он проверяет, существует ли UOW в текущем контексте, а затем фиксирует UOW. Если во время фиксации возникает исключение, такое как изменение схемы базы данных, это происходит до вызова OnCommitted и отправки не помещенных в очередь сообщений.

Как правильно реализовать UnitOfWork с Rebus?

1 ответ

Решение

Не могли бы вы попробовать пакет Rebus.UnitOfWork и посмотреть, сможете ли вы его использовать?

Он предоставляет переработанный интерфейс API для Rebus, который позволяет вам:

Configure.With(...)
    .(...)
    .Options(o => {
        o.EnableUnitOfWork(Create, Commit);
    })

где Create а также Commit может быть так:

public YourOwnUnitOfWork Create(IMessageContext context)
{
    return new YourOwnUnitOfWork(...);
}

public void Commit(IMessageContext context, YourOwnUnitOfWork uow)
{
    uow.Commit();
}
Другие вопросы по тегам