DDD 中的计划任务

gar*_*arf 3 domain-driven-design scheduled-tasks

我有一个名为Order的实体,以及一个聚合根OrderManager,它根据来自应用程序层的请求更新订单状态和其他一些信息(AppLayer 调用 OrderManager,OrderManager 管理包括订单在内的内部状态)。

每个订单都有到期时间,因此我想安排一个操作来处​​理到期时间。我不知道该把它放在哪里。我想到两种方法:

  1. 在领域模型中定义一个接口IScheduler。所以OrderManager使用这个接口来进行任务调度。
  2. 不要定义接口,而是在应用程序级别安排过期处理。这意味着应用程序层调用一些方法,例如 OrderManager.HandleExpiration

我个人更喜欢第一种方法,但也许有人有其他想法?

eul*_*rfx 5

首先,Order实体应该是Order聚合的聚合根。它应该封装状态更改行为,以便不需要管理器类。然后,应用程序服务将直接委托给Order实体。

至于处理订单到期,必须考虑一些事情。这些都需要坚持吗?换句话说,是否会存在持久保存到数据库但未加载到应用程序中的订单,需要对其过期进行处理?如果是这样,那么您需要实现一个超出应用程序边界的工作流程。实现此目的的一种方法是使用连续运行的后台服务,该服务轮询数据库以查找当前到期的订单。然后,它向处理订单到期事件的handled 发送命令。该处理程序将委托回您的域,最终委托给Order实体上的HandleExpiration方法。订单到期只是一个事件,与任何其他域事件一样处理,而后台服务只是使该事件成为可能的基础设施的一部分。这似乎最适合你的方法#2。