我对DDD和CQRS的概念是新的,无法找到一个最终的解决方案如何以一种干净的方式上传图像或文件。
我有三个想法来解决这个问题,但我对它们不是很满意。
方式1:
1。在单个请求中发布所有数据,包括图像(多部分)
2。创建FileUploadCommand
,它返回FileUploadDid
.
3。之后,创建createsupportRequestCommand
并将fileuploadid
与构造函数中的根数据一起传递。就CQRS而言,一个用户交互应该只有一个命令。
方法2:
1。将图像发送到分离endpoint,创建临时文件并返回id或文件句柄。
2。使用附加的tempfile ID发布公式。
3。使用所有根数据调用CreateSupportRequestCommand
,包括指向物理文件的文件句柄。
4。在该命令中,将tempfile持久化到FileUpload
聚合(byFileUploadRepository
),然后
5。创建SupportRequest
聚合,分配FileUploadId并persisted。
缺点:在同一个命令中处理2个聚合。创建支持请求不负责上载文件。
有没有更好的办法解决这个问题?
我不认为处理文件上传是一个域的问题。像FileContentID
这样的文件元数据可能是域的一部分,但不是实际的文件上传。我将在执行CommandHandler
之前执行文件操作。可能是在中间件中,或者是在将命令
添加到消息总线之前。
CreateSupportRequestCommandHandler
将只在aggrerate上调用CreateSupportRequest
之类的操作
(例如SupportRequest
)。在CreateSupportRequest
方法中,您将拥有与操作相关的所有业务规则。SupportRequest
最终将保存在存储库中。
所以我将通过使用一个例子来解释这个问题,因为它使一切更加具体,希望能减少歧义。 架构非常简单 1微服务 每个微服务都将使用CQRS/ES设计模式,这意味着 每个微服务都有自己的Aggregate映射现实世界问题的域 聚合的状态将从事件存储重建 每个事件都将表示聚合中的状态更改,并将通过消息代理传输到对更改感兴趣的任何服务 每个微服务都将在其自己的域内进行事务处理 每个微服务最终都会与其他域保持一致
null 我们尝试了几件事: > 发出命令: 激发命令 同步处理此命令,如果命令无效或引发事件,则返回错误。 null 缺点:-据我所知,应该用佐贺来编排流程。这里我们介绍“验证”的概念。我不确定这是不是推荐的方法。 验证是一个非常常见的概念。在分布式完全异步系统中如何处理它?
在CQRS ES和DDD中,聚合中的小读模型从其他聚合或有界上下文中获取数据是件好事吗? 例如,在订单验证(订单聚合)中,有一个业务规则,该规则仅在未标记客户时验证订单。标志信息通过同步域事件放入读取模型(特定于聚合)。 你怎么看?
很明显,基于这些模式的系统是易于扩展的。但我想问你,具体怎么做?关于可伸缩性,我没有什么问题: 如何缩放聚合体?如果我将创建
我想创建一个CQRS和事件源架构,非常便宜,非常灵活,非常简单。 我想确保事件永远不会失败,至少到达发布者/事件存储,永远,因为这是业务所在。 天蓝 有了azure,我似乎不知道该用什么。 Azure服务总线 蔚蓝函数 Azure webjob(我想这可以用Azure函数代替) ??(还有什么我忘了或者不知道的?) null 你的经验说明了什么? 其他替代方案呢?(例如:)?
CQRS.NET https://www.nuget.org/packages/Cqrs Symbols now available on nuget.org. See https://devblogs.microsoft.com/nuget/improved-package-debugging-experience-with-the-nuget-org-symbol-server/ for de