【问题标题】:Identifying Aggregates and Aggregate roots for an application识别应用程序的聚合和聚合根
【发布时间】:2022-01-25 02:36:23
【问题描述】:

我一直在阅读有关 DDD、事件溯源 (ES) 和 CQRS 的信息。我意识到,如果我们考虑 ES 和 CQRS,聚合一直是设计的核心。 如果我错了,请纠正我,但我了解到:

  1. 每个命令将对应一个聚合,这可以帮助我们定义命令
  2. 每个事件流对应一个聚合,方便我们定义事件结构。

现在我只是在想,如果可能的话,是否有任何工具或方法可以帮助我们从一些输入中识别现有应用程序中的聚合? 我相信“历史事务日志”和“数据库模式”作为输入确实有助于了解聚合的某些结构。我在这里可能又错了,但是有没有人尝试过类似的方法来简化软件工程师查找聚合的过程?

【问题讨论】:

    标签: transactions domain-driven-design database-schema cqrs event-sourcing


    【解决方案1】:

    如果您正在谈论从某个现有系统(大概是您希望用遵循域驱动设计设计的系统替换的系统)获取历史事务日志和数据库模式,我强烈反对这种方法。

    对于现有的实现,事务日志和模式充其量是域的编码,并且可能已经丢弃了一些上下文并以某种方式扭曲了域以适应数据库的约束。如果这些是您发现域的主要基础,那么您可能最好的情况是,您最终会得到一个在某些方面较差的现有系统的克隆。

    查找聚合的最简单方法是查看所需的操作并跟踪这些操作的顺序如何相互影响(例如,“此命令成功后如何影响后续命令是否成功”;如果答案为“否”效果”那么这些命令几乎肯定不是同一个聚合,因为在 CQRS 样式的 DDD 中聚合的目的是确定命令是成功还是失败)。这通常需要与领域专家合作来探索该领域,例如通过事件风暴(或一些类似的技术)。

    【讨论】:

    • 谢谢。我明白。我的方法是帮助开发人员首先根据不基于 DDD 的应用程序的现有信息识别聚合。如果事务日志和数据库模式还不够,根据您的解释,我愿意包含其他可用信息,以便让用户了解应用程序中的聚合边界。我不认为它是 100% 完美的,但接近它。我的主要想法是尽量避免使用事件风暴之类的技术或其他类似技术,并且仍然会在系统中提出一些边界级别的聚合。
    • 由于聚合定义了事务边界,你能做的最好的事情(假设每一种所需的事务都发生在日志中)是对于每个表中的每一列,取其他表/列在同一笔交易。然后可以从“传递闭包”派生可能的聚合(如果 A 用 B 更新(甚至一次)并且 B 与 C 一起至少更新一次,而不是 A、B 和 C 在同一个聚合中)。也许你会很幸运并从中获得可用的聚合体,但你最终会得到一个聚合体来统治世界……
    • ...该聚合基本上是一个糟糕的数据库,一次只能处理一个事务。超越这一点需要领域知识。
    • 非常感谢列维。这实际上也是我的想法。我知道在某些情况下我最终只会得到一个聚合。为了避免这种情况,我更多地研究了在同一聚合中标识的“如何定义实体之间的关系”。该关系可以是任何表示这两个实体应该属于同一个聚合的关系,并且可以省略被标识为在同一个聚合中的实体,因为它们的关系不强。我想要衡量他们关系的指标。
    • 我知道结果可能是非常糟糕的总和,而且是一个很长的机会,但我必须想出一些关于这个...
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多