领域层是否可以调用资源库保存数据?

来源:3-9 资源库与持久化

qq_慕丝0528892

2022-03-16

问题1:
在应用层取消订单代码中
updateOrder 方法是写在应用层

      Order order = orderRepository.getOrderById(event.getOrderId());
      order.cancel();
      orderRepository.updateOrder(order);

假如我将 updateOrder 方法移到领域层会是否违反原则?

public class Order {
  public void cancel() {
    state = OrderState.Canceled;
    eventBus.post(new OrderCanceledEvent(this));
    // 这里调用保存
    orderRepository.updateOrder(this);
  }
}

问题2:
我注意到 cancel() 方法中, 修改状态之后就会发送订单取消事件,
假设:
我在发送订单取消事件之后, 在向数据库中保存数据时或其他业务执行发生错误,
导致本次保存事务回滚, 那么订单实际就并没有取消成功,
那么发出去的事件所执行的代码却感知不到事务被回滚,
这种情况一般怎么处理?

写回答

1回答

尤达_技术咖啡

2022-03-16

问题1:

会违反,不要在实体内操作资源库。


问题2:

这里涉及的问题就是一致性问题,现实中,总是存在强一致性场景需要用最终一致性解决的情况,比如:售卖机硬件状态和服务器中售卖机实体以及订单的状态,是无法保证强一致性的,当售卖机出货失败的时候,必须保证订单百分百能被取消成功,而不可能反过来要求订单取消之后售卖机才能重新进入新交易。具体方法就是通过不断重试确保订单状态最终能被修改成功,课程用的也是这种方法。同理,订单和支付状态的一致性,也是这样来保证,订单状态修改也许会出现短暂失败的情况,但是一定要保证最终成功,通过这种方法确保实体之间状态的最终一致性以及业务逻辑正确性。

0
1
qq_慕丝0528892
非常感谢!
2023-01-06
共1条回复

DDD(领域驱动设计)思想解读及优秀实践

结合智慧零售项目实践,深度解剖DDD思想与应用方法

883 学习 · 98 问题

查看课程