0

我的域中有一个代表城市电网的实体。实际上,我的模型是一个包含断路器、变压器、线路的列表的实体。

每次断路器打开/关闭时网络都会发生变化,用户可以更改连接等......

在 CQRS 的所有示例中,使用 Version 和 aggregateId 查询 EventStore。

你认为我必须只为“网络”聚合或每个“可连接”项目实现事件吗?

在这种情况下,当我必须重播所有事件以获得“实际”状态(基于日期)时,我可以处理近 10000-20000 个事件。

一个事件修改一个属性还是我需要一个修改对象(包含对象的所有属性)的事件?

4

2 回答 2

1

我假设你的意思是目前你的“可连接项目”是“网络”聚合的一部分,你问它们是否应该是他们自己的聚合?这实际上取决于您的系统和问题的性质,并且更多的是 DDD 问题,而不是简单的 CQRS 问题。但是,如果您的更改的性质通常是对彼此独立的项目进行操作,那么可能应该是聚合根本身。无论如何,为了回答这个问题,我们需要更多地了解您正在建模的系统。

至于重播数千个事件的挑战,您当然不必为每个命令重播所有事件。当然快照是一种选择,但更好的是在首次加载聚合根对象后将它们缓存在内存中,以确保您不必从每个命令的事件中获取源(除非系统崩溃,在这种情况下您可以依赖快照为了更快地恢复,尽管您可能不需要缓存它们,因为您只需支付一次加载的代价)。

现在,如果您要跨多个主机或线程分发此系统,则还有一些其他问题需要考虑,但我认为最好将讨论留给另一个问题或论坛。

最后你问(我认为)一个事件可以修改一个对象状态的多个属性吗?是的,如果根据该事件所代表的意义,这是有意义的。事件的概念很简单,它代表聚合中的状态变化,但是这些事件也应该代表对业务有意义的概念。

我希望这会有所帮助。

于 2011-03-15T15:49:43.947 回答
1

规则总是有一个例外,但我认为您需要为您的域中处理的每个命令都有一个事件。您可以通过使用快照来解决处理如此多事件的问题。

http://thinkbeforecoding.com/post/2010/02/25/Event-Sourcing-and-CQRS-Snapshots

于 2011-03-10T13:14:36.727 回答