命令执行中的额外边界数据

时间:2017-02-28 22:58:07

标签: domain-driven-design cqrs

我有一个设计问题在我脑海中转过一段时间,我找不到一个好的解决方案。这是关于CQRS和域边界。

假设我有一个上下文,那就是为系统进行预订,以及事件。系统允许将单个预订链接到单个事件(已经完成,没有问题),并且每周预订链接到一系列事件。每周预订定义一周中的某一天(额外数据不相关);每周预订始终是开始和结束日(半年)。

系统还有两种类型的日子:正常日和非工作日,无法举行活动。

作为业务请求,用户希望每周一次的预订系统单独取消在非工作日举行的特定事件。

实际上,预订和事件存储在两个表中。如果事件存储有特殊标志,则会取消该事件。我没有与时间表的链接,因为我从未在我的业务环境中使用它。作为业务边界(与其他小数据相关,这里不相关),到目前为止,这个工作很有效。

这是我的问题:为了满足用户的请求(为每个删除的一天创建一个事件),我需要关于半年的所有日子的信息(只是在同一个工作日的那些就足够了)。但是,要获取此信息,我该如何处理?

我可能的解决方案:

  1. 在根实体中加载半年的所有日期。这可能非常沉重,我将扩展我的业务范围。
  2. 预处理命令,创建一个带有额外信息的命令。这将是一个命令,我读过的东西是危险的。对我而言足够了。
  3. 使用无效天数列表扩展命令。我怎么检查一天是无效的?我要访问实际边界之外的数据,这与1相同。
  4. 创建一个在命令处理程序中使用的服务,以获取不工作日的列表。日期上下文信息将在公共(或共享)上下文中移动。
  5. 为每周活动创建一个事件监听器。创建每周事件时,它会加载非工作日列表(该半年的工作日)并触发一系列命令以取消特定日期。这将封锁边界,不会将额外数据添加到公共上下文中,并且为了额外的目的重用相同的代码(取消事件)。
  6. 哪种解决方案最好?

1 个答案:

答案 0 :(得分:1)

Litmus测试:询问您的利益相关者是否曾发生过工作日变为非工作日,以及当天每周预订会发生什么。此外,是否曾经发生过非工作日成为工作日,以及那些天的预订会发生什么。

  

为每周事件创建​​一个事件监听器。创建每周事件时,它会加载非工作日列表(该半年的工作日)并触发一系列命令以取消特定日期。这将封锁边界,不会将额外数据添加到公共上下文中,并且为了额外的目的重用相同的代码(取消事件)。

根据我对你所写内容的理解,关闭。

在我看来,你真的有两种不同的聚合体;您有每周预订的定义,并且您有每日时间表来收集不同预订的活动。

当您创建预订时,您的输入是开始日期,结束日期,星期几,以及可能返回该范围内一周中的天数列表的域服务。考虑时间表或行程 - 我们正在确定此特定预订的候选日期。

您的事件监听器在看到新的预订时,会向该特定日期的日程安排聚合发出命令,并添加每日预订所请求的事件。由于时间表知道它是否是“非工作日”,它可以将每个事件标记为已安排或取消(如果您希望该信息是明确的;您可以将其隐含在工作日的状态中)在一些系统中)。

可以提前创建空计划,或者使用某些通用配方按需创建空计划,以确定它们是否处于工作日,并且如果它是您当前域的一部分,则可以支持更改自己的工作状态。

这里的关键想法是,非工作日是您的域模型的一部分,并且因为它们跨越多个预订对象,所以它们显然是位于预订聚合之外的实体。