【发布时间】:2018-06-05 14:29:12
【问题描述】:
基本上,用户想要更改其个人资料图片。
Web 服务器接收到针对/user/35435/profile/picture 发布的图像,因此需要保存数据,并更新配置文件对象的LastModification 属性。
图像不会本地存储在网络服务器中,它们需要上传到其他地方(即:云存储)。
目前,每个操作都由命令或查询表示。命令在环境事务(如 SQL 事务)中运行。图片上传操作不是事务性的,但可以在出错的情况下进行补偿操作(即:如果数据库操作失败,则删除图片)。
在一个简单的实现中,会创建一个包含当前日期和图像数据的命令。执行命令处理程序,它加载ProfileAggregate 聚合,并执行ProfileAggregate.updateProfilePicture(imageUploader, image, currentDate),并将imageUploader 域服务作为参数传递。在该方法中,上传图像并更新配置文件。命令处理程序将更改保存在 DB 中并返回。
我不喜欢在图片上传期间进行交易的事实。我不喜欢在聚合中执行非域模型操作(例如上传图像)(即使聚合正在其他地方调用)。
这种交互是否应该像两个以串行方式执行的独立命令一样建模,或者只要在具体实现中没有依赖关系,就可以将任何内容放入聚合中。
【问题讨论】:
-
KISS:上传图片在加载聚合并仅发送图片元数据和 storageId(没有实际图片数据)
-
命令用于编排域中实现的逻辑。这看起来像是图像上传和聚合更新的编排。我同意上面的康斯坦丁,虽然我会先生成一个图像 storageID,启动异步上传,然后更新聚合。如果上传出现问题,聚合应该能够处理丢失的图像。
标签: design-patterns domain-driven-design aggregateroot