mapping - 将不兼容的属性从 DTO 映射到实体
问题描述
我正在重构一个 Web 应用程序以确保我的实体始终以有效状态初始化。这意味着我使用 DTO 进行用户输入,并在验证后将这些 DTO 映射到我的实体。
但是,DTO 的某些属性不能直接映射到实体的属性。如果 DTO 包含 base64 编码图像并且实体需要图像文件的 URL,我需要将 base64 保存到映射器中的文件中,以便将该文件的 URL 分配给实体。
可能只是我,但感觉这种东西不属于实体映射器的 DTO。有什么理由说明这可能是个坏主意吗?这种映射通常使用哪些策略?
解决方案
在我看来,在您的情况下,您没有从DTO到实体的简单映射过程,因为您在该过程中有应用程序逻辑。将图像存储在某处并获取该图像的 URL/路径是特定于应用程序的逻辑,因此您可能需要为其提供服务。
应用程序通常具有需要执行和定义应用程序流程的某种任务或操作。定义此流程的一种方法是使用Commands并将DTO附加到这些Commands上。
例如,假设您有一个注册过程,因此用户必须输入一些数据并且您需要创建一个帐户实体。
对于 Web 应用程序,前端必须收集用户信息并创建并向后端发送命令。在这种情况下,您将拥有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);
}
如果您告诉我更多关于您的应用程序的信息,我可以为您的具体情况提供一个示例。
以下是您可以查看的一些资源:
推荐阅读
- javascript - 我试图了解如何通过部分应用函数来删除参数
- javascript - TypeError:无法读取未定义 Discord.js 错误的属性“get”
- windows - Windows 10 上保存 docker 图像的默认位置
- html - 在 iOS Safari 上使用“位置:固定”时的元素截止
- kubernetes - 如何在运行该 pod 的节点上获取 pod 名称和命名空间?
- c# - 更改另一个属性后应用更改到一个属性
- google-cloud-platform - 如何判断默认 GCP Cloud Vision API 支持哪些实体?
- python - Google Colab 中的袖扣烛台图错误
- python - 在基类或扩展类之间进行选择 - Python
- r - 反应值不适用于嵌套的 tabsetPanel