CQRS 和 DDD:文件上传

sen*_*enz 2 api domain-driven-design file-upload cqrs

我是 DDD 和 CQRS 概念的新手,无法找到如何以干净的方式上传图像或一般文件的最终解决方案。

想象一下以下场景:在在线门户中有一个支持请求公式,其中可以附加文件(特定图像)。发布的数据将引发CreateSupportRequestCommand. 然后将加载和更改所需的聚合。

我有三个想法来解决这个问题,但我对它们不是很满意。

方式 1:
1. 在单个请求中发布包括图像(多部分)在内的所有数据
2. 创建一个FileUploadCommand,它返回FileUploadId.
3.CreateSupportRequestCommand然后FileUploadId在构造函数中创建一个并传递根数据。
缺点:单个请求将触发两个命令。就 CQRS 而言,一次用户交互应该只是一个命令。

方式二:
1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 发布带有附加临时文件 ID 的公式。
3.CreateSupportRequestCommand使用包括指向物理文件的文件句柄在内的所有根数据调用。
4. 在命令中将临时文件持久化到FileUpload聚合中 (by FileUploadRepository) 然后
5. 创建SupportRequest聚合,分配 FileUploadId 并持久化。
缺点:我在同一个命令中处理 2 个聚合。创建支持请求不负责上传文件。

方式三: 1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 发布带有附加临时文件 ID 的公式。
3.CreateSupportRequestCommand使用包括指向物理文件的文件句柄在内的所有根数据调用。
4. 只将根数据持久化到SupportRequest聚合中。抬起 aSupportRequestCreatedEvent并附加文件句柄。
5. 在事件进程内部并分配文件句柄。
缺点:SupportRequestCreatedEvent不应该真正关心文件句柄。

有没有更好的方法来解决这个问题?

Ank*_*jay 6

我不认为处理文件上传是域问题。文件元数据FileContentId可能是您的域的一部分,但不是实际的文件上传。我会在执行之前执行文件操作CommandHandler。可能在中间件中,或者Command在将消息排队到消息总线之前。

CreateSupportRequestCommandHandler随后将只调用一个operation喜欢CreateSupportRequest你的aggrerate(说SupportRequest)。在该CreateSupportRequest方法中,您将拥有适用于操作的所有业务规则。SupportRequest然后最终将保存在您的存储库中。