在提交事务时,将调度在消息处理程序内发送/发布的任何消息。 (这是一个非常好的OOTB行为)
我已根据您的示例实施了UnitOfWork。发现如果在OnCommitted(action)
的操作中发生异常,则可能会发送已排队的消息,这取决于uow.commit()
操作之前deliver task是否已执行。
我通过在接收管道的末尾添加一个流程步骤找到了解决方法。它检查当前上下文中是否存在uow然后提交uow。如果在提交期间发生类似数据库模式更改的异常,则会在调用OnCommitted之前发生,并且不会调度排队的消息。
使用Rebus实现UnitOfWork的正确方法是什么?
答案 0 :(得分:0)
您可以试试Rebus.UnitOfWork包,看看是否可以使用它?
它为Rebus提供了一个经过重新设计的工作API单元,允许您使用:
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();
}