知识卡片

process生成事件、apply变更状态两分离以支持重建

普通读书笔记卡 · 1980.r

内容

聚合的创建与更新流程不同需区分。process()方法负责验证命令、执行领域逻辑、生成领域事件,但不负责修改聚合状态——状态变更交给单独的apply()方法,并在返回事件前调用它。之所以单独定义apply(),是为了聚合的重建:重建时先遍历聚合发生的所有领域事件,再逐一调用apply()完成状态变更,从而重用逻辑、保证状态变更一致性并真实体现历史。由于事件不可变,process()可定义为无副作用的纯函数——聚合从一个状态(事件)变迁到另一个新状态(事件),而非修改自身状态值,这正是事件范式与函数范式契合之处。发散:把「决定发生了什么」(process)与「据此改状态」(apply)分开,是事件溯源可重放的结构性前提。

参考来源

- 位置:《解构领域驱动设计》附录B B.2.2(源文件:_epub-src/OEBPS/035.xhtml) - 结论依据:原文说明process生成事件、apply单独变更状态及其为重建服务、process为纯函数。 - 原始内容:process()方法并不负责修改聚合的状态,这一职责交给了单独定义的apply()方法……process()方法就可以定义为一个没有副作用的纯函数。