【发布时间】:2014-04-09 21:24:52
【问题描述】:
假设我们有以下业务规则:
- 取消订单后,所有未发货的货物都应 取消。
- 个别货件可能因其他原因被取消。
如果我们同步做这些事情,我对事务范围有疑问:
- 我听说过 Aggregate == “事务边界”,但在这种情况下,请求范围 DbContext 是否更有益,以便所有同步处理程序在同一个事务中执行?如果后 2 个处理程序发生故障,它将提供更高的一致性。
- 如果#1 不是一个好主意,为什么?我们是否只是说“每个处理程序在其自己的事务中,如果在其中出现问题,你就靠自己了”?
- 如果 #1 是个好主意,我该如何使用 NServiceBus 的
Bus.InMemory做到这一点? The documentation对这个问题不是很清楚。
代码如下:
public class CancelOrder : ICommand
{
public Guid Id { get; set; }
}
public class OrderCancelled : IEvent
{
public Guid Id { get; set; }
}
public class CancelShipment : ICommand
{
public Guid Id { get; set; }
}
public class CancelOrderHandler : IHandleMessages<CancelOrder>
{
private DbContext _dbContext;
private IBus _bus;
public void Handle(CancelOrder message)
{
var order = _dbContext.Orders.Single(x => x.Id == message.Id);
// do some validation here
order.Status = OrderStatus.Cancelled;
// unsure about whether to call _dbContext.SaveChanges() or not
_bus.Publish(new OrderCancelled {
Id = message.Id
});
}
}
public class OrderCancelledHandler : IHandleMessages<OrderCancelled>
{
private DbContext _dbContext;
private IBus _bus;
public void Handle(CancelOrder message)
{
var commands = _dbContext.Shipments
.Where(x => x.OrderId == message.Id && x.Status != ShipmentStatus.Shipped)
.Select(x => new CancelShipment {
Id = x.Id
});
_bus.Send(commands);
}
}
public CancelShipmentHandler : IHandleMessages<CancelShipment>
{
private DbContext _dbContext;
public void Handle(CancelShipmentHandler message)
{
// Similar to CancelOrder, only with shipments.
}
}
【问题讨论】:
标签: transactions domain-driven-design nservicebus