课程用马。
我的问题是,在使用事件溯源跟踪更改时,我是否应该为用户打算做的事情创建事件
大概吧。在实体边界本身内,这并不重要;但从外部看历史,能够从事件中识别变化的背景可能非常有用。考虑发布/订阅;一旦您有一个实体编写事件,您可能想要开始订阅这些事件。
例如,考虑更改客户资料中的地址。这可能是纠正早期数据输入中的错字(企业跟踪错误率以寻找可纠正的系统问题以改善客户体验),或者客户的重新定位(在这种情况下,我们希望向他们的新客户发送欢迎工具包地址;或启动审核以根据现有政策审查他们的新地址)。
如果一切都在单个 AddressChanged 事件的保护伞下,您将失去这种灵活性。最好的情况是,您会发现自己试图仅从数据中猜测更改的上下文。
另一方面,如果这种灵活性没有带来任何价值,那么您就不需要它了。
也就是说,事件溯源 CRUD 很奇怪——如果您不将这些更改视为一等公民,那为什么还要事件溯源实体呢?写出聚合状态要简单得多。
写出事件和写出聚合状态有什么区别?
不是很多;读起来有点不同。
不那么神秘:写出聚合状态类似于写出聚合现在的样子。通常,这是由持久性组件完成的,它将当前状态序列化为 DTO。例如,我们可以用 JSON 文档来表示 Ledger 的当前状态
{ "date" : "2016-07-06"
, "amount" : 40
, "cleared" : null
}
为了稍后重新创建分类帐,我们只需从永久存储中获取 json 文档,然后让对象映射器开始工作。
写出历史,也就是事件,看起来更像
[ { "event_type" : "LedgerCreated"
, "data"
: { "date" : "2016-07-06"
, "amount" : 40
}
}
, { "event_type" : "LedgerCleared"
, "data"
: { "reason" : "Because I said so"
}
}
, { "event_type" : "ClearingRemoved"
, "data"
: {}
}
]
稍后要重新创建账本,我们需要从永久存储中取出 json 文档,然后使用对象映射器创建有序的事件序列,创建一个处于初始“种子”状态的账本,然后 重新应用这些事件到我们的新 Ledger 实体,通过重放历史上的每一个变化,有效地发现 Ledger 现在的样子。