Неожиданное поведение во время 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();
}