domain-driven-design - CQRS - 如何处理新的报告表(或 : how to import ALL history from the event store)

标签 domain-driven-design cqrs

我研究了一些 CQRS 示例实现(Java/.Net),它们使用事件源作为事件存储,使用简单的 (No)SQL 存储作为“报告存储”。

看起来一切都很好,但我似乎在所有示例实现中都遗漏了一些东西。

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

IE:

想象一个基本的 DDD/CQRS 驱动的 CRM 应用程序。
每个屏幕(实际上是 View )都有自己的结构化报告存储(SQL 表)。
所有这些 View 都使用监听域事件(CustomerCreated/CustomerHasMoved 等)的处理程序进行更新。

CRM 的一项功能是它可以记录电话调用(PhoneCallLogged 事件)。由于时间限制,我们只在 CRM 的 V1 中实现了电话记录(查看和报告谁处理了哪个电话将在 V2 中实现)

在生产中运行一段时间后,我们希望对每个客户和销售代表的电话记录进行“报告”。

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

这就是我在查看我研究的样本时陷入困境的地方。它们不处理将现有(历史)数据从事件存储导入(新)报告存储。

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

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

任何建议,建议?

提前致谢,

雷姆科

最佳答案

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

考虑你的例子......你的事件日志中有大量的PhoneCallLoggedEvents。拿起你的新 handle 并通过它播放所有旧事件。就像它一直在运行一样,它将继续处理到达的任何新事件。

干杯,

格雷格

关于domain-driven-design - CQRS - 如何处理新的报告表(或 : how to import ALL history from the event store),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2559096/

相关文章:

domain-driven-design - 如何在 DDD 中为实体的当前状态建模

c# - 使用单个值对象的不同表示

transactions - 使用 JOliver EventStore 更新多个聚合

entity-framework - 用于更新整个聚合的通用存储库

java - 使用领域驱动设计在后端和前端重复逻辑

haskell - 在 Haskell 中创建通用类型类

cqrs - JOlivier EventStore StreamRevision 和 CommitSequence 的区别和用法?

architecture - 使用 CQRS 进行多对多关系的替代方案

authentication - EventSourcing 应用程序中的用户身份验证

c# - 如何使用依赖于模型属性的接口(interface)设计领域模型