UnitOfWork期间出现意外行为

时间:2016-01-20 10:59:10

标签: messaging unit-of-work rebus

在提交事务时,将调度在消息处理程序内发送/发布的任何消息。 (这是一个非常好的OOTB行为)

我已根据您的示例实施了UnitOfWork。发现如果在OnCommitted(action)的操作中发生异常,则可能会发送已排队的消息,这取决于uow.commit()操作之前deliver task是否已执行。

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

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

1 个答案:

答案 0 :(得分:0)

您可以试试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();
}