Mapping 将不兼容属性从DTO映射到实体

Mapping 将不兼容属性从DTO映射到实体,mapping,entity,domain-driven-design,dto,Mapping,Entity,Domain Driven Design,Dto,我正在重构一个web应用程序,以确保我的实体始终以有效状态初始化。这意味着我正在使用DTO进行用户输入,并在验证后将这些DTO映射到我的实体 但是,DTO的某些属性不能直接映射到实体的属性。如果DTO包含base64编码的图像,并且实体需要图像文件的URL,则我需要将base64保存到映射器中的文件中,以便将该文件的URL分配给实体 可能只是我,但感觉这种东西不属于DTO到实体映射器。这可能是个坏主意,有什么原因吗?这种映射通常使用什么策略?在我看来,在您的案例中,您没有从DTOs到实体的简单映

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

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


可能只是我,但感觉这种东西不属于DTO到实体映射器。这可能是个坏主意,有什么原因吗?这种映射通常使用什么策略?

在我看来,在您的案例中,您没有从DTOs到实体的简单映射过程,因为在这个过程中有应用程序逻辑。将图像存储在某个位置并获取该图像的URL/路径是特定于应用程序的逻辑,因此您可能需要为其提供服务

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

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

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

RegisterUserCommand {

   string UserName
   string FirstName;
   string LastName;
   Image Avatar;
}
接下来需要的是一个RegisterUserCommandService或(RegisterUserCommandHandler,具体取决于您的喜好和使用的术语),它将处理命令。您还需要一个存储提供商,该提供商将提供存储和检索图像的服务操作(可以在文件系统、Amazon S3、Dropbox等上),并为您提供链接。下面是一个示例伪代码

RegisterUserCommandService {

  Process(RegisterUserCommand cmd) {

     avatarLink = storageProvider.Store(cmd.Avatar);

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

     accountRepository.Save(account);
}
如果你告诉我更多关于你的应用程序,我可以为你的具体案例提供一个例子

以下是您可以查看的一些资源:


您能否发布一些示例代码,说明您今天是如何做到这一点的?这将使我们更好地了解如何正确地向您提供建议。实际上,我已经在使用类似于CQR的方法,但在这种特殊情况下,DTO用于在表单中表示实体,并提交它并将更改应用于实体。请求和命令的数据完全相同;只是图像需要保存/转换。我问这个问题的主要原因是因为我经常看到人们提到DTO自动映射,我想知道像图像这样的东西怎么可能被自动映射。这就是我开始思考的原因,也许像保存图像这样的东西不属于mapper。但是,除此之外,我看不出有什么真正的原因我不能在mapper本身中实现图像的保存。映射器本身实际上可以被视为一项服务。我同意映射器是一项服务,您可以将图像保存添加到映射过程中,这样做很好:)。对我来说,缺点是这给了映射者另一个责任:保存图像,我认为这是特定于应用程序的逻辑。如果您考虑映射应用程序服务,那么就可以了。如果这是在一个服务操作中,那么它更容易计算出应用程序的流程,如果你有其他服务,则更一致。如果它是一个小应用程序,就像它不是一个问题:)对于具有良好定义的流的大型应用程序,可以更容易地实现和调试它。