我正在开发基于CQRS原则的新软件,但我有些疑惑。 我正在创建一个Saga来管理用户创建。每个用户都有一些一般信息(姓名,姓氏,生日),几个地址和其他东西。 " CreateUserSaga"由" CreateUserCommand"开始。在处理完CreateUserCommand之后,我想要引发一个" UserCreatedEvent"由同一个传奇人员处理。在这个事件中,我想发送命令CreateUserAddress来注册地址。 我不知道的是在哪里检索地址数据。我是否要在CreateUserCommand中发送它们?
答案 0 :(得分:1)
你真的有几个选择。
1)发送第一个命令和事件中的所有信息,然后在从命令移动到事件到下一个命令时开始删除后续事件/命令不再需要的数据......不是最好的。
2)拥有'客户' /呼叫系统保存所有数据(即使它是浏览器也必须拥有所有数据)提升你的第一个命令/事件(CreateUser / UserCreated)然后让那个'客户端'在收到UserCreated事件时发送下一个命令,添加必要的内容。你也可以在这里为进程添加其他事件处理程序,而不是收听UserCreated事件,但是已经处理过它的其他东西等等....用浏览器相当容易......但有时它有点过度杀伤力
3)通过命令将所有数据发送到saga,让该saga根据传入事件管理下一步命令的创建。与选项二相同,只使用另一个saga而不是客户端。这样可以使流量控制系统保持在您的系统内部...如果您不信任您的连接客户端......这会引发很多问题,说明为什么您不能信任您的连接客户。
在所有情况下,某些东西需要保存所有数据。无论是客户,单独的传奇还是第一个命令。我不会在你的例子中质疑为什么你需要它,但这些是你的选择。它们都是状态管理对象......某些东西包含所有传入的状态变化请求,并决定什么以及谁得到什么以及什么时候。