这应该很容易理解,但经过一些阅读后我仍然可以找到答案。
所以,说用户需要更改他的手机号码,完成后,我们可能会有一个命令:ChangedUserMobileNumber
持有新号码。负责处理命令的域将执行聚合中的更改并发布事件:UserMobilePhoneChanged
在另一个域中存在该事件的订阅者,该订阅者还在其聚合中保存用户移动号码但是根据我们的软件架构师,事件不能老化任何数据,因此我们最终说的至少是愚蠢的:
域1,接收更新移动号码的命令,更新号码并发布一个事件,因为事件无法保存数据,域1中的命令处理程序发出另一个命令,该命令被发送到域2.该事件的订阅者也在域2中,然后我们有一个Saga来处理事件和命令。
在实现方面,我们使用NServiceBus,所以我们有这个传奇来处理这些消息,在其中我们有这行代码,其中存储在saga实体中的entity.IsMobilePhoneUpdated字段在事件被处理时被更改。
bool isReady =(entity.IsMobilePhoneUpdated&& entity.MobilePhoneNumber!= null);
有效地,Saga由命令和域1中提出的事件启动,直到满足这个条件,传奇才能保持活力。
如果由我决定,我会在活动中发送手机号码,我只是想就此提出一些其他意见。
由于
答案 0 :(得分:3)
我不确定UserMobilePhoneChanged事件如何以任何方式有用,除非它包含新的电话号码。用户要求更改一个数字,事件就会发生变化。确实应该很简单。为什么您的架构师说事件不应包含任何信息?
答案 1 :(得分:1)
在基于第一个事件的系统中,我设计的事件也没有数据。我也确实执行了这条规则。当时听起来像是一个聪明的决定。过了一会儿,我意识到它是愚蠢的,因为它,我正在做很多变通办法。这也引起了事件订阅者的大量查询,即使对于琐碎的数据也是如此。在我意识到自己做错了之后,我没有问题改变这个“规则”。
事件应该包含使它们有意义所需的所有数据。此外,他们应该只拥有对该事件有意义的数据。 (在ChangePhoneNumber消息中包含用户地址没有意义)
如果您的架构师施加了这样的限制,那么开发CQRS系统并不容易。阅读模型如何更新?既然事件没有数据,那么你可以查询一些东西来获取数据(写入方?),找到一些向读取模型发送命令的方法(那么发布事件的意义何在?)。要解决您的问题,您应该尝试与这位建筑师进行专业讨论,最好包括其他技术负责人,并且不要冒犯任何人试图让他放松这个约束。
您可以使用的参数是事件采购。事件源是对CQRS的补充,没有具有数据的事件就没有意义。使用事件源时甚至更多,您拥有的唯一数据是存储在事件中的数据。即使您实际上没有实现事件源,也可以使用它作为事件获取数据的原因。
找到人员问题的技术解决方案毫无意义。