0

这应该很容易理解,但经过一些阅读,我仍然可以找到答案。

因此,假设用户需要更改他的手机号码,为了实现这一点,我们可能有一个命令:ChangedUserMobileNumber

持有新号码。负责处理命令的域将在聚合中执行更改并发布事件:UserMobilePhoneChanged

在另一个域中有该事件的订阅者,该用户的手机号码也包含在其聚合中,但根据我们的软件架构师的说法,事件不能旧任何数据,所以我们最终得到的结果至少可以说是相当愚蠢的:

域 1 接收到更新手机号码的命令,号码被更新并发布一个事件,同时,由于事件无法保存数据,域 1 中的命令处理程序发出另一个命令,该命令发送到域 2。该事件的订阅者也位于域 2 中,然后我们有一个 Saga 来处理事件和命令。

在实现方面,我们使用 NServiceBus,所以我们有这个 saga 来处理这些消息,并且在其中我们有这行代码,其中存储在 saga 实体中的 entity.IsMobilePhoneUpdated 字段在处理事件时发生了更改。

bool isReady = (entity.IsMobilePhoneUpdated && entity.MobilePhoneNumber != null);

实际上,Saga 是由 Domain 1 中引发的命令和事件启动的,并且在满足此条件之前,saga 将保持活动状态。

如果由我决定,我会在活动本身发送手机号码,我只是想就此获得一些其他意见。

谢谢

4

2 回答 2

3

我不确定 UserMobilePhoneChanged 事件如何以任何方式有用,除非它包含新的电话号码。用户要求更改一个数字,事件射出它有。确实应该很简单。为什么你的架构师说事件不应该包含任何信息?

于 2012-09-08T19:04:35.607 回答
1

在我设计的第一个基于事件的系统中,事件也没有数据。我也确实执行了该规则。在当时,这听起来像是一个聪明的决定。过了一会儿,我意识到它很愚蠢,因此我做了很多变通方法。这也导致了来自事件订阅者的大量查询,即使是对于微不足道的数据也是如此。在我意识到我做错了之后,我改变了这个“规则”没有问题。

事件应该具有使它们有意义所需的所有数据。此外,他们应该只拥有对该事件有意义的数据。(在 ChangePhoneNumber 消息中包含用户地址没有意义)

如果您的架构师强加了这样的限制,那么开发 CQRS 系统将不是一件容易的事。读取模型如何更新?由于事件没有数据,那么您要么查询某些内容以获取数据(写入端?),然后找到某种方式将命令发送到读取模型(那么发布事件的意义何在?)。要解决您的问题,您应该尝试与该架构师进行专业讨论,最好包括其他技术负责人,并且在不冒犯任何人的情况下尝试让他放松这一限制。

您可以使用的论点是事件溯源。事件溯源是对 CQRS 的补充,如果没有具有数据的事件,它就没有意义。甚至在使用事件溯源时,您拥有的唯一数据是存储在事件中的数据。即使您实际上没有实现事件溯源,您也可以将它的存在用作事件具有数据的原因。

找到解决人员问题的技术解决方案毫无意义。

于 2012-09-09T18:25:18.677 回答