【问题标题】:Aggregate relationships in Domain Driven Design领域驱动设计中的聚合关系
【发布时间】:2017-02-12 06:51:29
【问题描述】:

我有一个关于领域驱动设计中聚合之间关系的问题。

我有以下情况:我有一个聚合(问卷),其中有一些孩子(问题)。这些问题是实体,但是因为它们在问卷汇总中,所以它们可以具有本地身份(即 id 1234 的问卷中的 id 为 1 的问题;我可以有另一个 id 为 1 的问题,但在另一个问卷中)。因此,要引用一个问题,您始终必须使用其父问卷 ID 对其进行限定。

另一方面,我有另一个聚合(收集活动),它存储问卷中问题的数据(响应集)(收集活动通过其 id 指向问卷,并且响应集通过它的 ID)。我可以有多个收集活动(可能发生在不同的时间),每个收集活动存储不同的响应集,但针对相同的问卷(和问题)。

所以我的问题是:我是否设计得很好(根据 DDD)?或者我是否必须将问卷和问题作为单独的集合保存,以便从收集活动/响应集中引用它们?

我希望这是有道理的,谢谢。

【问题讨论】:

  • 查看我的更新答案

标签: domain-driven-design


【解决方案1】:

问问自己:应该保护哪些不变量?

在您的情况下,您必须确保在活动期间回答的问题存在(即其索引介于零和问卷中的问题数量 - 1 之间)并且是允许的;其他不变量可能是在回答至少一个问题后不得修改问卷;在任何这些情况下,活动都必须与问卷同步。我看到至少 2 个解决方案:

  1. 最简单的解决方案是拥有一个大聚合 Questionare 聚合,其中包含问题、活动和答案作为子实体,这样您就可以保护这些不变量;这对性能有一些影响,但只有您应该知道它是否可以接受。

  2. 第二种解决方案是使用事件驱动的架构,例如 CQRS+Event Sourcing。在这种情况下,您可以拥有单独的聚合并使用简单的 Saga 使它们保持同步,该 Saga 将来自 Questionare 聚合(如 QuestionAddedQuestionRemoved)的一些事件作为命令转发到 Campaingn 聚合。我更喜欢这种解决方案,因为它可以更好地分离职责。

【讨论】:

  • 那么一个问题本身,在问卷之外,是没有意义的。这是否有资格作为一个值得保护的不变量?而且,如果我们假设是这种情况,那么我如何“引用”问卷汇总之外的问题,收集活动汇总内部的问题,以链接响应集?我正在努力解决这个问题,但我需要帮助。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多