CQRS - 如何处理新报告表(或:如何从事件存储中导入所有历史记录)

Rem*_*Ros 12 domain-driven-design cqrs

我研究了一些CQRS样本实现(Java/.Net),它们使用事件源作为事件存储,使用简单(No)SQL存储作为"报告存储".

看起来很好,但我似乎在所有示例实现中都缺少某些东西.

在应用程序投入生产后,如何处理新报表存储/屏幕的添加?以及如何将现有(最新)数据从事件存储导入新报表存储?

即:

想象一下基本的DDD/CQRS驱动的CRM应用程序.每个屏幕(真的查看)都有自己的结构化报表存储(SQL表).所有这些视图都使用侦听域事件(CustomerCreated/CustomerHasMoved等)的处理程序进行更新.

CRM的一个特点是它可以记录电话呼叫(PhoneCallLogged事件).由于时间限制,我们只在CRM的V1中实现了电话呼叫的记录(查看和报告谁处理了哪个电话将在V2中实施)

在生产中运行一段时间后,我们希望实现每个客户和销售代表记录的电话呼叫的"报告".

因此,我们需要添加一些屏幕(视图)和支持报告表(在报告存储中),并用事件存储中已收集的数据填充它...

这是我在看我研究的样品时卡住的地方.它们不处理将现有(历史)数据从事件存储导入(新)报表存储.

EventRepository(DomainRepository)的所有示例只有一个方法'GetById'和'Add',它们不支持一次性获取所有聚合根以填充新的报告表.

如果没有初始数据导入,新屏幕仅针对新发生的事件进行更新.不适用于已记录的电话(因为没有PhoneCallLogged事件的报告侦听器)

有什么建议,建议吗?

提前致谢,

REMCO

Gre*_*ung 8

您在现有事件日志上重新运行处理程序(例如,您通过新事件处理程序播放旧事件)

以您为例...您的事件日志中有大量的PhoneCallLoggedEvents.带上你的新手柄并通过它播放所有旧事件.它就像它一直在运行,并将继续处理任何到达的新事件.

干杯,

格雷格