Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CQRS传奇管理_Cqrs_Saga - Fatal编程技术网

CQRS传奇管理

CQRS传奇管理,cqrs,saga,Cqrs,Saga,我正在开发一个基于CQRS原则的新软件,但我有一些疑问。 我正在创建一个传奇来管理用户创建。每个用户都有一些基本信息(姓名、姓氏、生日)、几个地址和其他信息。“CreateUserSaga”由“CreateUserCommand”启动。在处理CreateUserCommand之后,我想引发一个“UserCreatedEvent”,它由同一个传奇处理。在这个事件中,我想发送CreateUserAddress命令来注册地址。 我不知道从哪里检索地址的数据。我必须在CreateUserCommand中

我正在开发一个基于CQRS原则的新软件,但我有一些疑问。 我正在创建一个传奇来管理用户创建。每个用户都有一些基本信息(姓名、姓氏、生日)、几个地址和其他信息。“CreateUserSaga”由“CreateUserCommand”启动。在处理CreateUserCommand之后,我想引发一个“UserCreatedEvent”,它由同一个传奇处理。在这个事件中,我想发送CreateUserAddress命令来注册地址。
我不知道从哪里检索地址的数据。我必须在CreateUserCommand中发送它们吗?

您确实有一些选择

1) 发送第一个命令和事件中的所有信息,然后在从一个命令移动到另一个命令和事件时,开始删除后续事件/命令不再需要的数据。。。不是最好的

2) 让“客户端”/“调用系统”保存所有数据(即使是浏览器,也必须包含所有数据)发出第一个命令/事件(CreateUser/UserCreated),然后让该“客户端”在接收到UserCreated事件时发送下一个命令,添加必要的内容。您还可以在这里向流程中添加其他事件处理程序,而不是侦听UserCreated事件,而是侦听已经处理过的其他事件,等等。。。。使用浏览器很容易。。。但有时这有点过分了

3) 通过命令将所有数据发送到传奇中,让传奇根据传入事件管理下一步命令的创建。与选项二相同,只是使用另一个传奇而不是客户端。这使流量控制保持在系统内部。。。如果你不信任你的连接客户。。。这就提出了很多问题,为什么你不能信任你的客户


在所有情况下,都需要一些东西来保存所有数据。无论是客户端、单独的传奇还是第一个命令。我不会质疑为什么在示例中需要它,但这些是您的选择。它们都是状态管理对象。。。有些东西保存所有传入的状态更改请求,并决定什么、谁得到什么以及何时得到什么。

坦白地说,考虑到您使用的术语及其通常使用的方式,您的计划没有意义。您似乎混淆了命令/事件及其与传奇和聚合根的相互作用。我建议阅读一些关于这个主题的介绍文献,这可能是一个很好的起点。FWIW,在大多数情况下,“用户创建”是一个简单的CRUD应用程序都非常好的用例。您好,感谢您的回复。在我的例子中,用户创建不是一个简单的Crud操作,因为它包括与其他聚合根的交互。Saga用于管理不同聚合根之间的交互,处理多个命令和事件。对吗?在我的情况下(这只是一个例子),如果我想在创建用户后保存地址,谁会发送数据?CreateUserCommand也必须包含地址数据?启动传奇的命令必须包含传奇将使用的所有数据?