【问题标题】:Extra boundary data in command execution命令执行中的额外边界数据
【发布时间】:2017-03-01 11:25:43
【问题描述】:

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

假设我有一个上下文,即关于系统的预订和事件。该系统允许将单个预订链接到单个事件(已经完成,没有问题),以及链接到事件集合的每周预订。每周预订完成定义一周中的某一天(额外数据不相关);每周预订总是有开始和结束的一天(半年)。

系统也有两种类型的日子:正常日子和非工作日,不能举行活动。

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

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

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

我可能的解决方案:

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

哪个是最好的解决方案?

【问题讨论】:

    标签: domain-driven-design cqrs


    【解决方案1】:

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

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

    结束,基于我对你所写内容的理解。

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

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

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

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

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

    【讨论】:

    • 因此,如果我正确理解了您的建议,最后一个选项是最好的。两个聚合,有两个不同的目的,一个事件监听器用不允许的事件列表“更新”每周预订。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2017-08-04
    • 2012-01-19
    • 2015-12-16
    • 2012-10-23
    • 2013-04-16
    • 2016-04-02
    相关资源
    最近更新 更多