我正在开发基于 CQRS 原则的新软件,但我有一些疑问。我正在创建一个 Saga 来管理用户创建。每个用户都有一些一般信息(姓名、姓氏、生日)、几个地址和其他内容。“CreateUserSaga”由“CreateUserCommand”启动。处理完 CreateUserCommand 后,我想提出一个由同一个 saga 处理的“UserCreatedEvent”。在这个事件中,我想发送命令 CreateUserAddress 来注册地址。我不知道在哪里检索地址数据。我必须在 CreateUserCommand 中发送它们吗?
问问题
251 次
1 回答
1
你真的有几个选择。
1)发送第一个命令和事件中的所有信息,然后开始删除后续事件/命令不再需要的数据,因为您从一个命令移动到另一个事件并进入下一个命令......不是最好的。
2)让“客户端”/调用系统保存所有数据(即使是浏览器也必须拥有所有数据)引发您的第一个命令/事件(CreateUser/UserCreated)然后让“客户端”发送下一个命令当它接收到 UserCreated 事件时添加必要的内容。您还可以在此处将其他事件处理程序添加到进程中,而不是侦听 UserCreated 事件,而是侦听已经处理过它的其他事件等等……在浏览器中相当容易……但有时它有点矫枉过正。
3) 通过命令将所有数据发送到 saga,让 saga 根据传入事件管理下一步命令的创建。与选项二相同,只是使用另一个 saga 而不是客户端。这将流控制保留在您的系统内部......如果您不信任您的连接客户端......这会引发很多关于为什么您不能信任您连接的客户端的问题。
在所有情况下,都需要保存所有数据。无论是客户端、单独的 saga 还是第一个命令。我不会质疑您为什么在示例中需要它,但这些是您的选择。它们都是状态管理对象……某物持有所有传入的状态更改请求,并决定什么和谁得到什么以及何时得到什么。
于 2016-02-18T01:26:07.893 回答