CQRS和DDD:文件上传

问题描述 投票:-1回答:1

我是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
1个回答
2
投票

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

CreateSupportRequestCommandHandler将仅在您的集合体上调用operation之类的CreateSupportRequest(例如SupportRequest)。在该CreateSupportRequest方法中,您将拥有与该操作相关的所有业务规则。 SupportRequest然后最终将保存在您的存储库中。

© www.soinside.com 2019 - 2024. All rights reserved.