php-将DDD与事件源混合在一起
作者:互联网
我无法理解将DDD与ES混合在一起的概念.我认为事件是域方面的一部分.鉴于将它们从存储库发布到外部世界并保持模型的纯净和简单没有问题.但是除此之外,还必须有可能以特定的聚合重放它们.这是我的问题发生的地方.我想让我的领域模型保持纯净而简单,而这些对象仍然与lib / framework无关.
要将过去的事件应用于聚合,聚合必须知道是ES结构的一部分(因此它将不保留为纯域对象).由于聚合的主要工作是封装一些可能随时间演变的商务不变量,因此无法使用聚合API来应用旧事件.例如,存在带有子实体评论的汇总帖子.今天,Post允许添加10条注释,并且方法addCommnet()可以保护该规则.但这并非一直如此.一年前,用户最多可以添加20条评论.因此,处理过去的事件可能不符合当前的规则.
百老汇(流行的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总结的工作方式,事件不检查,因为他们表达的是已经发生在过去的事实.这意味着应用事件永远不会引发异常.
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.
是什么使您无法忽略该事件或与一年前的情况有所不同?
这种特殊情况应使您考虑CQRS的功能:写入逻辑与读取逻辑不同.您可以将事件应用到聚合上,以验证到达它的将来的命令(写/命令端).显示这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不可变对象.仅读取模型更新程序具有持久性依赖关系,但可以使用接口将其反转.
标签:domain-driven-design,php,event-sourcing 来源: https://codeday.me/bug/20191025/1928891.html