【问题标题】:Mapping non-compatible properties from DTO to entity将不兼容的属性从 DTO 映射到实体
【发布时间】:2019-08-18 11:41:29
【问题描述】:

我正在重构一个网络应用程序,以确保我的实体始终以有效状态初始化。这意味着我使用 DTO 进行用户输入,并在验证后将这些 DTO 映射到我的实体。

但是,DTO 的某些属性不能直接映射到实体的属性。如果 DTO 包含 base64 编码图像并且实体需要图像文件的 URL,我需要将 base64 保存到映射器中的文件中,以便将该文件的 URL 分配给实体。

可能只是我,但感觉这种东西不属于实体映射器的 DTO。有什么理由说明这可能是个坏主意吗?这种映射常用什么策略?

【问题讨论】:

  • 您能否发布一些示例代码来说明您今天是如何做到这一点的?这将使我们更好地了解如何为您提供适当的建议。

标签: mapping entity domain-driven-design dto


【解决方案1】:

在我看来,在您的情况下,您没有从 DTOs 到 Entities 的简单映射过程,因为您在该过程中有应用程序逻辑。将图像存储在某处并获取该图像的 URL/路径是特定于应用程序的逻辑,因此您可能需要为其提供 Service

应用程序通常有一些需要执行的任务操作,并定义应用程序的流程。定义此流程的一种方法是使用 Commands 并将 DTO 附加到这些 Commands

例如,假设您有一个注册过程,因此用户必须输入一些数据并且您需要创建一个帐户实体。

对于网络应用程序,前端必须收集用户信息并创建并向后端发送命令。在这种情况下,您将拥有 RegisterUserCommand。此命令将包含 UserInfo DTO 属性,或者将包含用户信息的属性。例如:

RegisterUserCommand {

   string UserName
   string FirstName;
   string LastName;
   Image Avatar;
}

接下来您需要的是一个 RegisterUserCommandService 或(RegisterUserCommandHandler 取决于您使用的品味和术语)来处理/处理 Command .您还需要一个 StorageProvider 来提供存储和检索图像的服务操作(可以在文件系统、Amazon S3、Dropbox 等上)并为您提供链接。这是一个示例伪代码

RegisterUserCommandService {

  Process(RegisterUserCommand cmd) {

     avatarLink = storageProvider.Store(cmd.Avatar);

     account = new Account(cmd.UserName, ...., avatarLink);

     accountRepository.Save(account);
}

如果您告诉我更多关于您的应用程序的信息,我可以为您的具体情况提供一个示例。

您可以查看以下资源:

【讨论】:

  • 我实际上已经在使用与 CQRS 类似的方法,但在这种特殊情况下,DTO 用于表示表单中的实体,并提交它并将更改应用于实体.请求和命令的数据完全相同;只是图像需要保存/转换。我问这个问题的主要原因是因为我经常看到人们提到 DTO 自动映射器,我想知道像图像这样的东西是如何自动映射的。这就是我开始思考的原因,也许像保存图像这样的东西不属于映射器。
  • 然而,除此之外,我看不出我不能在映射器本身内实现图像保存的真正原因。映射器本身实际上可以被视为一种服务。
  • 我同意映射器是一项服务,您可以将图像保存添加到映射过程中,这样做很好:)。对我来说,缺点是这给了映射器另一个责任:保存我认为是应用程序特定逻辑的图像。如果您考虑映射器应用程序服务,那么就可以了。如果这是在服务操作中,那么更容易弄清楚应用程序的流程,如果您有其他服务,则更加一致。如果它是一个像 CRUD 一样的小型应用程序,那不是问题 :) 对于具有良好定义流程的大型应用程序,可以更轻松地实现和调试。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2021-12-31
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多