【发布时间】:2024-01-21 19:46:01
【问题描述】:
我正在努力掌握 DDD 背后的想法,并将其应用到我们拥有的一个宠物项目中,我有一些问题希望这里的人能够回答。
该项目是一个文档管理系统。我们遇到的特殊问题与我们的系统处理的两个概念有关:Document 的概念和 DocumentStatus 的概念。
Document 有许多属性(例如标题、作者等)。用户可以在 Document 的整个生命周期内更改任何属性。
Document 可能在任何时候处于特定状态,例如 NEW、UNDER_REVISION、REVISED、APPROVED 等。对于每个状态,我们需要知道是谁进行了该更改那个状态。
我们需要能够根据文档状态查询系统。示例查询是“获取所有处于REVISED 状态的文档”。
"获取所有状态已被用户 X 更改的文档"
Document 和DocumentStatus 需要在同一事务中更改的唯一时间是在创建Document 时(创建文档并同时为其分配状态NEW) .
对于所有其他时间,UI 允许更新其中之一但不能同时更新(即您可以更改文档的属性,例如作者,但不能更改其状态。)或者您可以更新其状态(从 NEW 到 @ 987654336@) 但不是它的属性。
我认为我们可以安全地考虑 Document 是一个实体和一个聚合根。
我们对DocumentStatus 是什么感到困惑。一种选择是使其成为 Document 聚合的值对象的一部分。
另一种选择是使其成为实体并成为其自身聚合的根。
我们还想提一下,我们考虑过各种 DDD 文档中描述的 CQRS,但我们认为这太麻烦了,特别是考虑到我们需要对 DocumentStatus 执行查询这一事实。
欢迎任何指点或想法。
【问题讨论】:
-
您是要记录所有状态转换还是只记录当前状态?
-
我们将记录任何状态变化。我们记录新状态、请求人、更改原因和时间戳。因此,每个文档会有多个状态。当前状态将是最后输入的状态。