【问题标题】:Can I say Axon Commands and Events are considered as anemic models?我可以说轴突命令和事件被视为贫血模型吗?
【发布时间】:2021-08-01 14:39:33
【问题描述】:

我的问题很直接,正如主题中提到的那样。 但是,请允许我在这里简要解释一下我的无辜想法。 我已经使用 Axon 大约 10 个月了。我曾经基于 Hexagonal architecture 设计我的项目结构,其中两个顶级包分别为domaininfrastructure。 此外,domain 包将包含不同的域对象(如 DDD 概念中所述),如下所示:

  1. Aggregate(这将是一个 Axon aggregate 类)。
  2. Repository(在我的例子中,这将是一个 Spring Data Repository 接口)。
  3. Entity(在我的例子中,它包含我用于基于集合的一致性验证的任何查找实体,如 here 所写)。
  4. Service PortInputOuput 端口接口的集合)。
  5. Commands(代表Axon Command对象)。

至于Events,我曾经将它们放在我编译为jar 文件的不同模块上,因此我可以将其分享给其他将在他们的项目中使用相同事件的开发人员。

我最近注意到我所有的命令和事件基本上都是贫血模型(我们应该避免的反模式)。 有什么好的做法吗?或者,它是设计有意使用的东西吗?

我一直在考虑将我的 Command 类放在我的 Aggregate 类中(作为内部类)。至少通过使用这种方法,我最终不会有这么多贫血模型分散在外面。有什么想法吗?

【问题讨论】:

    标签: domain-driven-design axon


    【解决方案1】:

    命令被设计成反映外部世界的行为和输入结构。它们不一定反映聚合的结构。

    有时它们甚至没有明确地连接到一个单一的聚合体。将它们包含在聚合中可能会产生代码异味,因为您会考虑资源和 UI 组织,而不是事务边界和实体组。

    你也违反了开闭原则。用户界面和请求结构等易失层的更改会使您编辑 Aggregate 类,这不是好的设计。

    关于更一般的说明...

    有时,贫血与非贫血(或干与非干)的争论可能会将您推向过早且不正确的优化方向。尽量避免这个陷阱,因为您最终会在代码级别进行优化,但您的域会受到影响。

    DDD 和 CQRS 指南符合可帮助您长期控制复杂性的原则。保持不同和独立的事物有助于您实现这一目标。

    【讨论】:

      【解决方案2】:

      首先,在 DDD 中,您的域必须没有任何框架,只需使用纯语言库即可。

      那么,混合命令和聚合不是一个好的解决方案。我认为 Commands 属于 Port,而 Aggregates 属于 Hexagone。

      最后,DDD 强调了专家对领域的发现。是你做的吗 ?否则,如果您只使用 Tacticts 模式,您将错过 DDD 中最重要的部分之一。

      【讨论】:

      • 是的 Julien..我也知道该主要原则之一。我们的领域应该只是纯语言库,没有任何框架/基础设施的东西。像六边形、干净代码和洋葱这样的架构教会了我们如何在我们的领域内保护我们的业务规则,并且任何框架/基础设施的东西都应该移到外部层。但是,由于我使用的是 Axon... 我的 Aggregate 肯定包含一些 Axon 内容,例如 @Aggregate@CommandHandler@EventSourcing 注释,这似乎违反了该主要原则:-/。
      • DDD 中没有任何内容表明域模型必须摆脱“框架”。您需要确保的是,您能够以尽可能少的技术选择限制对域进行建模。有时,框架实际上可以帮助您实现这一目标。使用 Axon,我们可以帮助您表达(因此是 CommandHandler/EventSourcinfHandler)注释。尝试不建模。很有可能它不会变得更好......
      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2011-09-19
      • 2010-10-28
      • 2018-12-14
      • 2021-01-23
      • 2010-11-04
      相关资源
      最近更新 更多