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

Extra boundary data in command execution

我有一个设计问题一直在我脑海中盘旋,但我没有找到一个好的解决方案。它是关于 CQRS 和域边界的。

假设我有一个上下文,它是关于为一个系统接受预订,以及随后的事件。该系统允许将单个预订 link 编辑到单个事件(已经完成,没问题),并将每周预订 link 编辑到一组事件。每周预订完成定义一周中的一天(额外数据不相关);每周预订总是有开始和结束日期(半年)。

系统还有两种工作日:正常日和非工作日,不能举办活动。

作为业务请求,用户希望对于每周的预订,系统单独取消在非工作日举行的特定活动。

实际上预订和活动存储在两个 table 中。当事件以特殊标志存储时,事件将被取消。我没有 link 与 table 的日子,因为我从未在我的业务环境中使用过它。作为业务边界(与其他小数据,此处不相关),到目前为止,这工作得很好。

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

我可能的解决方案:

  1. 在根实体中加载半年的所有天数。这可能真的很沉重,我必须扩展我的业务范围。
  2. 预处理命令,创建一个带有额外信息的命令。这将是命令中的命令,我读过的东西很危险。对我而言足够了。
  3. 使用无效日期列表扩展命令。我如何检查一天是否无效?我必须访问我实际边界之外的数据,这与 1 相同。
  4. 创建一个在命令处理程序中使用的服务来获取非工作日的列表。天上下文信息将在公共(或共享)上下文中移动。
  5. 为每周事件创建​​一个事件侦听器。创建每周事件时,它会加载非工作日列表(对于那半年的那个工作日)并触发一系列命令以取消这些特定日期。这将封闭边界,而不是将额外的数据添加到公共上下文并为其他目的重用相同的代码(取消事件)。

哪个是最好的解决方案?

石蕊测试:询问您的利益相关者是否会发生工作日变成非工作日的情况,以及那些日子的每周预订应该发生什么情况。此外,非工作日是否会变成工作日,以及 那些 天的预订应该发生什么。

Create an event listener for weekly events. When a weekly event is created, it loads the list of not working days (for that weekday of that half year) and fires a sequence of commands to cancel that particular days. This would seal the boundaries, not adding extra data to a common context and reuse same code (cancel event) for extra purposes.

关闭,基于我对你所写内容的理解。

在我看来,你确实有两种不同的聚合;您有每周预订的定义,并且您有从不同预订收集事件的每日时间表。

创建预订时,您输入的是开始日期、结束日期、星期几,可能还有一个域服务可以 return 该范围内的星期几列表.思考时间表或行程——我们正在为这个特定的预订定义候选日期。

您的事件侦听器在看到新预订后,会向该特定日期的日程表聚合发出命令,添加每日预订请求的事件。因为日程表知道它是否是 "non-working day",它可以将这些事件中的每一个标记为已安排或已取消(如果您希望该信息是明确的;您可以将其隐含在工作日的状态中一些系统)。

可以提前创建空计划,或者根据需要使用一些通用方法来确定它们是否是工作日,并且可以支持更改它们自己的工作状态(如果这是您当前域的一部分)。

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