【问题标题】:Problem with DDD and changing only one Aggegate in one transactionDDD 的问题并且在一个事务中仅更改一个聚合
【发布时间】:2021-09-11 20:30:08
【问题描述】:

我的个人项目有问题。

我有项目,它有阶段,阶段有任务。起初,我试图在该聚合中创建 Project 和 AggregateRoot 以及 Stage 和 Tasks 实体。由于还有其他实体,例如 Costs、Installments、FinancialData 以及许多其他实体,Project 已经开始成长为神级,所以我重新考虑了所有实体,并将 Project、Stage 和 Task 分开了 AggregateRoot。

所以我已经开始重构它,一切都很好,但是我在一个功能上遇到了问题。状态系统。有时,Task 状态的更改会启动 Stage 和 Project 状态的一系列更改(例如,将新 Task 添加到 finished Stage 应该将该阶段置于 in progress em> 状态,然后如果项目处于 已完成 状态,也应移动到 进行中)。这是我的问题。如何处理? 到目前为止,我正在做的事情是从存储库中加载项目,这是应用程序服务中标记为 @Transactional 的第一个操作,并在所有操作后保存在该方法的末尾。

在重构之后,有时我需要在一个事务中更改三个 AggregateRoot。如果那应该是一个 Aggregate,那么 Project 将返回状态,此时它有大量方法来处理阶段和任务上的所有更改。我有点迷路了。

是否应该在操作的最开始加载所有三个,将它们传递到操作链中,并在方法调用结束时保存在每个存储库上?

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    可以接触多个聚合的操作通常最好建模为 saga(如果是事件驱动的,还有一个替代方案,但您的问题中没有任何内容表明系统的其余部分是事件驱动的)。 saga 将在各种聚合上运行,重要的是,能够处理操作的失败/拒绝(例如,取决于要求:重试(意味着可能存在任意长时间的可见不一致)、撤消对其他聚合的更改或撕裂关闭系统(为了一致性而牺牲可用性)。

    【讨论】:

    • 我的项目中的整个状态系统都是事件驱动的,但是在那里调用的事件侦听器希望将 AgreggateRoot 作为方法参数。示例:我有一个方法,可以在应用层创建任务。它从存储库加载任务,然后转到域服务并处理创建任务并调用另一个域服务将状态更改为 ToDo。然后监听器被触发并检查是否需要更改 Stage 上的状态。但所有这些都发生在我使用存储库的下一层。所以我在这里想念的是从存储库加载的阶段。
    • 如果阶段正在更新,为什么需要从存储库加载它?
    • 这是问题所在,虽然 Project 是我的聚合根,但我正在传递 Project,它有阶段,阶段有任务,所以我可以从项目中得到我需要的东西。现在 Project、Stage 和 Task 是独立的 AR,所以在创建 Task 时,我无法从中访问 Stage,所以当我需要更新 Stage 时,我没有在那里加载它。这就是问题的全部。
    • 然后需要一个 saga,认识到每次更新(至少从 DDD 的角度来看)都是一个单独的事务。
    • 好的,感谢 cmets @Leci Ramsey。我将需要重构负责状态更改的服务,以便它们可以放入 saga 中的动作链中,而不仅仅是在域逻辑中的某处的大动作链中。
    【解决方案2】:

    您应该了解您是否真的需要状态之间的事务一致性,也许最终一致性将是一种解决方案,您将通过事件更新状态。如果它需要事务一致性,那么它必须是一个聚合,因为这是聚合保护真正不变量的主要特征。要找到问题的答案,您需要在实际项目中向企业询问此问题。重要的是真正的不变量,在你的例子中,我认为,你有面向实体的聚合,但你需要更多的策略或面向过程的聚合,其能力只是保护真正的不变量而不是数据容器。也许这个视频会有所帮助Mauro Servienti - Talk Session: All Our Aggregates Are Wrong

    【讨论】:

    • 这就是我想要弄清楚的——它是否应该是一个聚合体。如果它是一个 - 我有一个巨大的根。另一方面,如果不是,当最后一个事件验证失败时,如何确保我的所有操作都将被回滚? (加载任务,验证状态改变的可能性,改变状态,保存任务 -> 运行任务状态改变的监听器 -> 加载阶段,验证,改变状态,保存 -> 运行阶段状态改变的监听器 -> 加载项目,验证,验证失败 -> 阶段和任务的状态应该恢复到以前的状态)。
    猜你喜欢
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2015-11-11
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多