在以战术域驱动设计为模型的事件源系统中,我无法处理以下情况:
- 项目被选择在发票上。
- 要么所有选定的项目形成发票,或者如果任何选定的项目无法分配,则不分配任何项目并且发票不存在。
- 不变性:一个项目不得出现在多张发票上。
- 一旦包含项目的发票存在,项目应转换为价格。
我的计划是
- 发票聚合类型,因此发票有一个标识来分组项目并存储计算的价格。
- 我会有一个 Item 聚合类型,它通过为每个聚合实例存储对一张发票的单个引用来跟踪不变量。
我想我需要针对新的 Invoice 聚合触发命令,其中包含要分配给新发票的现有项目 ID 的列表。这将发出一个关于发票创建的事件。
然后一些东西会监听这个事件并将它翻译成一个命令列表,这些命令将每个选定的项目分配给新发票。
我看到这可能会失败:例如,在发出命令后,其中一个选定的项目可能已分配给另一张发票。因此,我会以某种方式需要回滚所有未失败的分配并声明发票不再存在。
另一方面,要计算发票上的价格,我需要知道最初选择的所有项目何时实际分配给发票,以确保发票留在这里。
目前我正在使用 Elixir 中的 Commanded CQRS/Event Sourcing 框架,该框架基于 Erlang Actor 模型。
我的天真的想法来自于使用非分布式关系数据库的悠久历史,将整个情况放入一个同步事务中,该事务分布在两个聚合上。但是该框架似乎不支持这一点,它也或多或少地破坏了异步分布式聚合实现最终一致性的想法。
因此,我正在为我的问题寻找合适的解决方案。任何帮助,将不胜感激。