gpt4 book ai didi

node.js - 在 NestJS CQRS 配方中处理 "Event Sourcing"的首选方式

转载 作者:行者123 更新时间:2023-12-03 12:11:38 24 4
gpt4 key购买 nike

我一直在尝试找出在使用 NestJS CQRS 配方 (https://docs.nestjs.com/recipes/cqrs) 时进行“事件溯源”的首选方式。
在过去的几周里,我一直在研究 NestJS 框架,并且喜欢它的各个方面。除了在某些领域非常薄的文档。
NestJS 对如何实现“事件溯源”并没有真正的看法,或者我遗漏了一些明显的东西。
我的主要问题是:保持事件本身最简单的方法是什么?
现在,我的事件看起来很基本:

import { IEvent } from '@nestjs/cqrs';

export class BookingChangedTitleEvent implements IEvent {
constructor(
public readonly bookingId: string,
public readonly title: string) {}
}
我最初的想法是使用 TypeORM ( https://docs.nestjs.com/recipes/sql-typeorm ) 并使我的每个事件不仅实现 IEvent , 还要让它继承一个 TypeORM @Entity() .
但是,每个事件都会有一个表 (SQL) 或集合 (NoSQL),因此无法读取发生在单个聚合上的所有事件。我错过了什么吗?
另一种方法是将每个事件转储到 JSON,这听起来很容易。但是我将如何加载对象 IEvent那么来自数据库的类(class)呢? (听起来我正在实现自己的 ORM)

最佳答案

所以我正在做类似的事情并使用postgres,它确实支持TypeORM白话(reference)中的json('simple-json')。无论好坏,我的事件实体看起来像:

@Entity()
export class MyEvent {
@PrimaryGeneratedColumn('uuid')
id: string;

@Column()
name: string;

@Column('simple-json')
data: object;

@CreateDateColumn({type: 'timestamp'})
created_at: Date;
}


需要注意的是,我仅将持久事件用于审计跟踪以及我尚未构建的潜在预测的灵 active 。您完全可以使用 TypeORM 在 postgres 中查询 JSON,例如。 .where('my_event.data ::jsonb @> :data', {data: {someDataField: 2}}) ,但我的理解是查询您的事件以获取当前状态有点缺少 CQRS 的意义。最好在新的投影表中建立聚合或更新一个巨大的投影。

我对我目前坚持我的事件的方式很好,但它肯定不是 DRY。我想用一个通用的 saveEvent 扩展一个基类方法或使用 EventHandlerFactory 类在其构造函数中获取存储库会更干净一些,而不是将存储库注入(inject)每个处理程序。

也许有人在那里有一些好的想法?

关于node.js - 在 NestJS CQRS 配方中处理 "Event Sourcing"的首选方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53905964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com