domain-driven-design - DDD 用两个聚合中的不变量修改每个事务的一个聚合

标签 domain-driven-design aggregateroot

假设我有一个聚合根 租户 和一个聚合根 组织 。多个 组织 可以链接到单个 租户 租户 在其聚合中仅具有 组织 Id

假设我在 组织 聚合中有以下不变量: 组织 只能有一个特定产品类型的订阅。

假设我在 租户 聚合中具有以下不变量:与租户相关的所有 组织 中必须仅存在一个产品类型订阅。

我们如何使用每个交易规则的一个聚合来强制执行这些不变量?
组织 添加订阅时,我们可以轻松验证第一个不变量,并触发域事件以更新(最终一致性) 租户 ,但是如果不变量在 租户 聚合中被违反会发生什么?

这是否意味着触发另一个域事件以回滚 组织 聚合中发生的情况?在成功修改第一个聚合后将响应发送到 UI 的情况下,这似乎很棘手。

或者这里的真正方法是在启动更新之前使用域服务来验证两个聚合的不变量?如果是这样,我们是将不变量/规则直接放在域服务中,还是将某种 bool 验证方法放在聚合上以保持逻辑在那里?

更新
如果违反了一个不变量,UI 必须阻止用户保存在 UI 中怎么办?在这种情况下,我们甚至不会尝试更新聚合。

最佳答案

您可能需要考虑的一件事是您的领域中可能缺少一个概念。您可能想要探索您的方案是否有可能将某些内容作为订阅计划概念,它本身就是一个聚合并强制执行您当前尝试放入租户/组织聚合中的所有这些规则。

面对这样的场景时,我往往会想“如果根本没有促进这种操作的系统,组织会做什么”。在您的情况下,如果来自同一个租户的多个人,每个人都负责一个组织......他们将如何同步他们的订阅以符合不变量?

在这样的练习中,您可能会遇到一些已经探索过的场景:

  • 举办聚会事件(例如电话 session )以确保没有进行多余的订阅:这就是域服务路径。
  • 每个人都进行自己的订阅并相互通知,最终收回多余的订阅:这就是事件 + 回滚路径。
  • 他们可能会妥协并保留一个共享的分类帐,在那里他们可以检查订阅在公司范围内的进展情况,分类帐是此类决策的权威:这就是缺少的聚合路径。

  • 如果你足够强调这个问题,你可能会找到其他选择。

    关于domain-driven-design - DDD 用两个聚合中的不变量修改每个事务的一个聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50134208/

    相关文章:

    c# - 域实体应该作为接口(interface)还是作为普通对象公开?

    asp.net-mvc - 访问 View 中的域对象

    domain-driven-design - 聚合根取决于用例,那么这是否意味着我们最终可能会得到很多存储库?

    repository - 领域驱动设计和聚合引用

    domain-driven-design - DDD : Aggregate design - Referencing between aggregates

    domain-driven-design - DDD。我应该修改存储库中的实体吗?

    entity - 汇总一个实体

    domain-driven-design - DDD - 虚构的聚合根

    domain-driven-design - DDD 子实体验证

    c# - 如何使用存储库模式处理子实体的分页?