gpt4 book ai didi

php - 将 DDD 与事件溯源混合在一起

转载 作者:可可西里 更新时间:2023-11-01 00:55:07 24 4
gpt4 key购买 nike

我无法理解将 DDD 与 ES 混合在一起的概念。我认为事件是领域方面的一部分。鉴于将它们从存储库发布到外部世界并保持模型纯净和简单没有问题。但除此之外,必须有可能在特定聚合上重播它们。这是我的问题发生的地方。我想让我的域模型保持与 lib/framework 无关的纯粹和简单的对象。

要在聚合上应用过去的事件,聚合必须意识到自己是 ES 结构的一部分(因此它不会保持纯域对象)。由于聚合的主要工作是强制执行一些可能随时间演变的业务不变量,因此不可能使用聚合 API 应用旧事件。例如,聚合 Post 和子实体 Comments。 Today Post 允许添加 10 条评论,并且方法 addCommnet() 守卫该规则。但过去并不总是这样。一年前,允许用户添加最多 20 条评论。因此,应用过去的事件可能不符合当前规则。

Broadway(流行的 PHP CQRS 库)通过在没有任何预验证的情况下应用事件来解决这个问题。方法 addCommnet() 只是根据我们的不变量检查它,然后处理应用程序事件。 Applyinig 事件本身不做任何进一步的检查。这很好,但我认为这是在我的领域模型中的高度集成。我的领域模型真的需要了解基础设施(这是保存数据的 ES 风格)吗?

编辑:用尽可能简单的词来陈述问题:是否有机会从聚合中摆脱所有这些 applyXXX() 方法?

编辑2:我已经用 PHP 编写了(有点老套)这个想法的 PoC - github

最佳答案

免责声明:我是 CQRS framework家伙。

Broadway (popular PHP CQRS library) works around the problem by applying events without any prevalidation. 

这就是每个 CQRS 聚合的工作方式,不会检查事件,因为它们表达的是过去已经发生的事实。这意味着应用 event 永远不会抛出 exceptions

To apply past events on aggregate the aggregate must be aware of being part of ES structure (wherefore it would not remain pure domain object)

不,它没有。它必须知道它过去的事件。那很好。

Today Post allows 10 Comments to be added, and method addCommnet() guards that rule. But it is not used to be that way all time. One year ago user was allowed to add up to 20 Comments. So appying past events may not meet current rules.

是什么让您aggregate忽略该事件或以与 1 年前不同的方式解释?!这种特殊情况应该让您思考 CQRS 的强大功能:写入与读取具有不同的逻辑。您在聚合上应用事件以验证到达它的 future 命令(写入/命令端)。显示这 20 个事件由其他逻辑(读取/查询端)处理。

This is where my problem occurs. I would like to keep my domain models pure and simple objects that remain lib/framework agnostic.

CQRS 使您的聚合保持纯净(无副作用)、不依赖任何库且简单成为可能。我使用 cqrs.nu 提供的样式来执行此操作, 通过产生事件。这意味着聚合命令处理程序方法实际上是 generators .

读取模型也可以非常非常简单,纯 PHP 不可变对象(immutable对象)。只有读取模型更新程序依赖于持久性,但可以使用 interface 反转。

关于php - 将 DDD 与事件溯源混合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47953944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com