UnitOfWork 期间的意外行为

Unexpected behaviour during UnitOfWork

消息处理程序中的任何消息 send/publish 都将在提交事务时分派。 (这是一个非常好的 OOTB 行为)

我已经实现 UnitOfWork per your example. Discovered that if a exception occurred inside the action of OnCommitted(action) the enqueued messages might get sent, it just depends if the deliver taskuow.commit() 操作之前执行。

我通过在接收管道末尾添加一个处理步骤找到了解决方法。它检查当前上下文中是否存在 uow,然后提交 uow。如果在提交期间发生 数据库架构更改 之类的异常,则它会在调用 OnCommitted 之前发生,并且不会调度任何排队的消息。

用 Rebus 实现 UnitOfWork 的正确方法是什么?

你能试试Rebus.UnitOfWork包,看看能不能用?

它为 Rebus 提供了重新设计的工作单元 API,您可以:

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

其中 CreateCommit 可能是这样的:

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

public void Commit(IMessageContext context, YourOwnUnitOfWork uow)
{
    uow.Commit();
}