DDD中的计划任务

时间:2013-02-13 15:31:14

标签: domain-driven-design scheduled-tasks

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

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

  1. 在域模型中定义接口IScheduler。因此OrderManager使用此接口进行任务调度。
  2. 不要定义界面,而是在应用程序级别安排expitation处理。这意味着app层调用了一些方法,如OrderManager.HandleExpiration
  3. 我个人更喜欢第一种方法,但也许有人有另一种想法?

1 个答案:

答案 0 :(得分:2)

首先,订单实体应该是订单聚合的聚合根。它应该封装状态改变行为,这样就不需要管理器类。然后,应用程序服务将直接委派给订单实体。

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