gpt4 book ai didi

design-patterns - 您如何使用 DDD 对保存图像的操作进行建模?

转载 作者:行者123 更新时间:2023-12-04 01:34:04 25 4
gpt4 key购买 nike

基本上,用户想要更改其个人资料图片。
Web 服务器收到针对 /user/35435/profile/picture 发布的图像,因此需要保存数据,并更新配置文件对象的 LastModification 属性。

图像不会本地存储在 Web 服务器中,它们需要上传到其他地方(即:云存储)。

目前,每个操作都由命令或查询表示。命令在环境事务(如 SQL 事务)中运行。图片上传操作不是事务性的,但可以在出错的情况下进行补偿操作(即:如果数据库操作失败则删除图片)。

在一个简单的实现中,创建了一个包含当前日期和图像数据的命令。执行命令处理程序,它加载 ProfileAggregate 聚合,并通过 ProfileAggregate.updateProfilePicture(imageUploader, image, currentDate) 域服务作为参数执行 imageUploader。在该方法中,上传图像并更新配置文件。命令处理程序将更改保存在数据库中并返回。

我不喜欢在图像上传期间进行交易的事实。我不喜欢从聚合内进行非域模型操作(例如上传图像)(即使聚合正在其他地方调用)。

这种交互应该像两个以串行方式执行的独立命令一样建模,或者只要在具体实现中没有依赖项,就可以将任何内容放入聚合中。

最佳答案

您的命令处理程序可能位于您架构的“应用程序层”中。因此,考虑到这一点,您会收到一个命令,并协调您的域/其他服务来满足它。

也就是说,我真的不喜欢两种不同的命令实现,因为从客户端的角度来看,它们只执行一个操作。您可以创建一个代理命令(单个命令)并在其处理程序上生成两个命令(一个用于处理聚合,另一个用于处理上传),但这种方法将来会使您的 API/模型不那么直观。

我也不喜欢将操作的上传部分捆绑在 Profile 聚合中,因为它似乎根本不是它的职责之一。

我在这里建议的是以下方法:

  • Profile 聚合应该负责接受一张图片。因此,它的操作 updateProfilePicture 将简单地评估图片元数据(也许您有一个规则,即图片必须具有特定大小或针对某种算法进行验证以尝试找到裸体,这种东西)和目标 Profile 的内部状态允许操作发生并使用 lastUpdated 属性或其他内容更新其内部状态。
  • ImageUploadService 将为您提供独立的功能来接收图像并相应地存储它。
  • 这两个操作都将独立发生,并最终通过消息传递保持一致。

  • 因此,您的命令处理程序将:
  • 加载配置文件聚合
  • 调用 updateProfilePicture(如果达到无效状态,它将中止)。在这里,您可能希望使 Profile 聚合处于 PendingUpload 状态(如果您想对上传采取悲观的方法),或者只是假设上传通常会成功(采取乐观的方法)并在失败时采取补偿措施。
  • 直接异步调用 ImageUploadService(即发即忘)
  • 在上传完成后提交对 Profile 的更改

  • 当 ImageUploadService 完成接收图像时,它会向 Profile 域发送一条消息,报告上传成功/失败。然后:
  • 如果您采用悲观方法,成功将使 Profile 聚合脱离其挂起状态。
  • 如果您采用乐观的方法,则在 Success 中不需要处理。
  • 在任何一种情况下,都应该通过将 Profile 聚合回滚到图片的更新前状态来处理上传失败。
  • 关于design-patterns - 您如何使用 DDD 对保存图像的操作进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702633/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com