[英]CQRS and DDD: File uploads
我是 DDD 和 CQRS 概念的新手,无法找到如何以干净的方式上传图像或一般文件的最终解决方案。
想象一下以下场景:在在线门户中有一个支持请求公式,其中可以附加文件(特定图像)。 发布的数据将引发CreateSupportRequestCommand
。 然后将加载和更改所需的聚合。
我有三个想法来解决这个问题,但我对它们不是很满意。
方式一:
1. 在单个请求中发布包括图像(多部分)在内的所有数据
2. 创建一个FileUploadCommand
,它返回FileUploadId
。
3. 之后创建一个CreateSupportRequestCommand
并在构造函数中传递带有根数据的FileUploadId
。
缺点:单个请求将触发两个命令。 就 CQRS 而言,一次用户交互应该只是一个命令。
方式二:
1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 发布带有附加临时文件 ID 的公式。
3. 使用包括指向物理文件的文件句柄在内的所有根数据调用CreateSupportRequestCommand
。
4. 在命令中将临时文件持久化到FileUpload
聚合中(通过FileUploadRepository
)然后
5. 创建SupportRequest
聚合,分配 FileUploadId 并保留。
缺点:我在同一个命令中处理 2 个聚合。 创建支持请求不负责上传文件。
方式三: 1. 将图像发布到单独的端点,创建一个临时文件并返回 id 或文件句柄。
2. 发布带有附加临时文件 ID 的公式。
3. 使用包括指向物理文件的文件句柄在内的所有根数据调用CreateSupportRequestCommand
。
4. 仅将根数据持久化到SupportRequest
聚合中。 SupportRequestCreatedEvent
并附加文件句柄。
5.在事件进程内部并分配文件句柄。
缺点: SupportRequestCreatedEvent
不应该真正关心文件句柄。
有没有更好的方法来解决这个问题?
我不认为处理文件上传是域问题。 FileContentId
等文件元数据可能属于您的域,但不是实际文件上传的一部分。 我会在执行CommandHandler
之前执行文件操作。 可能在中间件中,或者可能在将Command
排队到消息总线之前。
CreateSupportRequestCommandHandler
会那么只能调用一个operation
就像CreateSupportRequest
您aggrerate(说SupportRequest
)。 在该CreateSupportRequest
方法中,您将拥有适用于该操作的所有业务规则。 SupportRequest
最终将保存在您的存储库中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.