【发布时间】:2021-07-18 18:10:10
【问题描述】:
我目前正在开发一个单体系统,我想将其引入现代并结合 DDD 和 CQRS。有人要求我重新编写解决方案的导入机制,我觉得这可能是开始重新架构过程的好机会。
目前的流程是:
- 用户上传 CSV
- 系统解析 CSV 并在屏幕上显示每一行。对每一行以及与每一行相关的错误/警告进行验证
- 用户可以修改每一行并重新验证所有行
- 然后用户选择没有错误的行并提交导入
- 行导入和任何未选择的行,或有错误的行进入暂存区,以便他们日后处理
对此的其他详细信息是多行可能属于同一实体(例如,2 行可能是订单中的行项目,因此具有相同的 Order Ref)。
我正在考虑有一个导入传奇,它会生成一堆导入聚合(例如 OrderImportAggregate),然后在提交导入时,这些将被转换为当前在系统中使用的类,这有望成为聚合重新设计时,他们自己的权利更进一步!因此,传奇过程将采取以下方式:
- [EntityType]FileImportUploaded - 存储 CSV
- [EntityType]FileImportParsed - 生成 n 个 [EntityType]Import 聚合。[EntityType]ImportItemCreated 引发/处理的事件
- Process 将调用当前实体经过的验证例程,以生成错误列表(如果有),并针对每个项目进行存储。 [EntityType]ImportItemValidated 引发/处理的事件
- 每次在屏幕上更改行时,它都会为 saga 和项目 ID 调用 Web api 方法来更新详细信息并根据第 3 点重新验证行。
- 用户提交导入,服务将实体分组在一起,例如,基于 ref,它们被转换为当前系统实体并调用它们的导入/保存例程。 [EntityType]ImportItemCompleted 事件引发。
- 当所有聚合都处于 ImportItemComplete 状态时,Saga 完成
由于这是我第一次实现 CQRS/事件溯源/DDD,我想从正确的基础开始,所以想知道这是否是实现此功能的理想方法?
【问题讨论】:
-
在整个问题中重复出现的“[EntityType]”是什么?
-
有多种类型可以导入。在不放弃我实际工作的情况下,我能想到的最接近的事情就是能够将客户和订单从在线商店导入一些后台系统。实体类型是客户和订单。
-
好的,你的聚合保护的不变量是什么?
-
他们将在遗留代码中强制执行当前类的不变量,例如客户必须有超过一定年龄的出生日期、有效姓名等。但也会保留验证错误(如果有)以及警告,例如警告实体已存在于系统中。这些不适合客户/订单等当前遗留类的域。
-
我正在尝试了解旅游业务以及此
import process的意义以及它与这些聚合的关系。
标签: domain-driven-design cqrs event-sourcing