【发布时间】:2020-01-28 20:35:50
【问题描述】:
我是 DDD 和 CQRS 概念的新手,无法找到如何以干净的方式上传图像或一般文件的最终解决方案。
想象以下场景:
在在线门户中,有一个支持请求公式,其中可以附加文件(具体的图像)。
发布的数据将引发CreateSupportRequestCommand。然后将加载和更改所需的聚合。
我有三个想法可以解决这个问题,但我对它们不是很满意。
方式 1:
1. 在单个请求中发布包括图像(多部分)在内的所有数据
2. 创建一个FileUploadCommand,它返回FileUploadId。
3. 之后创建一个CreateSupportRequestCommand 并在构造函数中将FileUploadId 与根数据一起传递。
缺点:一个请求会触发两个命令。就 CQRS 而言,一个用户交互应该只有一个命令。
方式 2:
1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 使用附加的临时文件 ID 发布公式。
3. 使用所有根数据调用CreateSupportRequestCommand,包括指向物理文件的文件句柄。
4. 在命令内部将临时文件保存到 FileUpload 聚合(通过 FileUploadRepository)然后
5. 创建SupportRequest 聚合,分配FileUploadId 并持久化。
缺点:我在同一个命令中处理 2 个聚合。创建支持请求不负责上传文件。
方式 3:
1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 使用附加的临时文件 ID 发布公式。
3. 使用所有根数据调用CreateSupportRequestCommand,包括指向物理文件的文件句柄。
4. 仅将根数据持久化到SupportRequest 聚合。提出SupportRequestCreatedEvent 并附加文件句柄。
5.在事件进程内部并分配文件句柄。
缺点:SupportRequestCreatedEvent 不应该真正关心文件句柄。
有没有更好的方法来解决这个问题?
【问题讨论】:
标签: api file-upload domain-driven-design cqrs