【问题标题】:CQRS and DDD: File uploadsCQRS 和 DDD:文件上传
【发布时间】: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


    【解决方案1】:

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

    CreateSupportRequestCommandHandler 只会在您的聚合(比如SupportRequest)上调用operation 之类的CreateSupportRequest。在该CreateSupportRequest 方法中,您将拥有所有业务规则来保留操作。 SupportRequest 然后最终将保存在您的存储库中。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多