DTO 的替代品

2023-10-31

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!

数据传输对象是在进程之间承载数据的对象。使用它的动机是进程之间的通信通常通过远程接口完成,其中每次调用都是昂贵的操作。由于每次调用的大部分成本都与客户端和服务器之间的往返时间有关,因此减少调用次数的一种方法是使用一个对象(DTO)来聚合本应传输的数据由几个呼叫,但仅由一个呼叫提供服务。

我相信(并且仍然相信)它应该成为过去。然而,它的使用似乎仍然很普遍。

我不否认转换数据有一些正当理由。但是,传统的 DTO 流程还有其他替代方案:

  • 从服务层返回一个业务对象

请注意,我之前从事的项目,我们直接将 BO 映射到从数据库读取的实体。

  • 将 BO 转换为表示层中的 DTO

  • 从表示层返回 DTO

1、返回实体本身

当实体的属性是需要显示的属性的超集时,不需要聚合其他属性。将实体转换为 DTO 不仅是矫枉过正。它会阻碍性能。

在这种情况下,最好的方法是返回实体本身。

2、JPA 投影

我们在特定情况下请求特定数据。因此,当调用到达数据访问层时,所需数据的范围是完全已知的:执行适合此范围的 SQL 查询是有意义的

为此,JPA 提供了预测。本质上,查询中的投影允许精确地选择想要的数据。这是一个例子;给定一个Person实体类和一个PersonDetails普通类:

CriteriaQuery<PersonDetails> q = cb.createQuery(PersonDetails.class);
Root<Person> c = q.from(Person.class);
q.select(cb.construct(PersonDetails.class,
  c.get(Person_.firstName),
  c.get(Person_.lastName),
  c.get(Person_.birthdate)
));

3、Jackson 转换器

具体到 JSON,我们可以将提供正确数据的过程委托给序列化框架,例如 Jackson。其背后的想法如下:主要代码像往常一样处理实体,在边缘,杰克逊转换器将其转换为所需的 JSON 结构。

如果需要更少的数据,那就是小菜一碟。如果更多,那么转换器需要额外的依赖项来获取数据。当然,如果这些数据来自同一个数据存储区,那就不是很好,上面的替代方案更相关。如果没有,这是一个选择。

4、GraphQL

最后但并非最不重要的一点是,可以返回完整的实体并让客户端决定哪些数据在其上下文中有意义。

GraphQL就是围绕这个想法构建的:Facebook 创建了它,现在它是完全开源的。它的主要优点是在其之上提供规范和许多特定于语言的实现。

API 的查询语言

GraphQL 是一种 API 查询语言,也是一种使用现有数据完成这些查询的运行时。GraphQL 为您的 API 中的数据提供了完整且易于理解的描述,使客户能够准确地询问他们需要什么,仅此而已,使 API 更容易随着时间的推移而发展,并支持强大的开发人员工具。

5、结论

当业务模型和演示模型之间存在差距时,很容易回到古老的“模式”,例如 DTO。但是,上述任何替代方案都可能更相关。

PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTO 的替代品 的相关文章

  • 微信小程序webview(H5页面)调用微信小程序支付

    1 业务描述 微信小程序商城入口进入的页面是商城H5页面 在H5页面进行微信支付如何实现 2 微信小程序 webview访问H5页面 必须使用微信小程序支付 如何实现以及实现方式以及支付后页面返回功能 商品详情 h5页面 gt 商品确认页
  • 人工智能不断发展扫码升级刷脸是必然趋势

    人工智能技术的不断发展 刷码升级成刷脸也是必然趋势 刷脸技术落地以后 迎合5G浪潮 将会提供更精准 更完善 更丰富化的服务 它的全面应用将会为企业带去智能化体验 也会引发新一轮的行业变革 起到真正的赋能作用 支付宝 微信支付 银联的三大巨头

随机推荐

  • Go Code Review Comments 译文

    持续更新中 原文最新链接https github com golang go wiki CodeReviewComments 5a40ba36d388ff1b8b2dd4c1c3fe820b8313152f Github译文链接https
  • Keil5添加.c文件与.h文件的方法-导入支持库-新大陆物联网竞赛-Lora模块&NBIOT模块例程-添加导入文件

    一 概述 在某些情况下 我们使用现用的物联网开发例程 例如新大陆物联网的Lora与NBIOT的例程 我们对其例程内目前所有的库不满意 不足以实现开发需要的功能 我们需要在原有工程上添加我们自己的库 以满足开发需要 二 操作步骤 首先 打开文
  • 【NodeJs-5天学习】第一天篇④ ——了解NodeJs回调函数和事件驱动机制

    NodeJs 5天学习 第一天篇 NodeJs回调函数和事件处理机制 1 Node js 中的回调 Callback 函数 2 Nodejs事件循环模型 2 1 浅析事件驱动 2 2 深入NodeJs事件驱动 3 总结 面向读者群体 电子物
  • logback 配置详解(二)——appender

    1 appender
  • solidworks 2020小金球_solidworks2020如何开启小金球RealView

    solidworks2020如何开启小金球RealView 如何查看sw否开启小金球RealView 只有在建模环境下依次点击 视图 显示 RealView图形 就可以看见小金球RealView是否开启 像图片中的呈现灰色 则表示小金球Re
  • 今天使用模板特化所遇到的问题

    template lt class T gt void test const T t cout lt lt void test const T t lt lt endl template lt gt void test lt int gt
  • Ubuntu中deb包详解及打包教程

    一 deb包详解 1 gt deb 包的文件结构 deb 软件包里面的结构 它具有DEBIAN和软件具体安装目录 如etc usr opt tmp等 deb包本身有三部分组成 组成 详细 数据包 包含实际安装的程序数据 文件名为 data
  • C# 中的Dispose()用法

    Dispose 在向大家详细介绍C 调用Dispose 方法之前 首先让大家了解下Dispose 方法 然后全面介绍C 调用Dispose 方法 我们已经知道了处置那些占用非受控 unmanaged 资源的对象的重要性 现在应该编写资源管理
  • 反射——通过工厂类来完成获取接口示例

    反射可实现程序中无new关键字 实现真正的解耦合 import java lang reflect InvocationTargetException import java lang reflect Member 只要是获取接口示例 都应
  • python离线安装第三方库

    python离线安装第三方库 安装包下载 cmd实现离线安装 zip文件包下载安装 whl文件下载安装 由于内外网的物理隔离 导致很多python的第三方库无法在线安装 只能选择离线安装了 离线安装具体如下 安装包下载 python除了本身
  • 职场年度最励志文章:纽约华人女教师直指人心的23条金句

    多年的工作经历让我深刻理解这23句职场的肺腑之言 也许对于一个初出茅庐的大学毕业生 这些内容显得高屋建瓴 并不能被深刻理解 推荐这篇文章 不在于要你记住多少 而是希望透过别人经验的这面镜子 审视自己 如果有什么忠告 只有一句话 去经历 你就
  • 强化学习 gridworld P77 模拟

    import numpy as numpy from tabulate import tabulate class State class for each unit on the game def init self id if id 0
  • 实体-联系模型

    实体 联系 Entity Relationship E R 模型 以下简称E R模型 的提出旨在方便数据库的设计 它是通过允许定义代表数据全局逻辑结构的企业模式实现的 E R模型采用三个基本概念 实体集 联系集和属性 实体集 实体 enti
  • VirtualBox虚拟机 Ubuntu分辨率太小的解决方案

    转自 http blog csdn net xubinlxb article details 18092297 今天用VirtualBox成功装上Ubuntu10 04之后发现了一个问题 默认情况下 ubuntu 的分辨率最高只能设到800
  • vba中颜色代码

    更详细的可以看 VBA颜色代码 经典颜色收藏版打印版 豆丁网
  • 测试人员与开发人员的比例究竟多少是合理的?

    在一些软件大会上 人们常常会问这样一个问题 测试人员与开发人员的比例究竟多少是合理的 而这样的问题 很难直接给出一个答案 为什么会有这样的问题 可能来自于两方面的压力 许多公司领导总是希望得到一个合理的比例 然后按这个比例分配招聘的名额 或
  • IDEA中创建Java Web项目方法2

    以下过程使用IntelliJ IDEA 2021 3 一 创建Maven项目 1 File gt New gt Projects 2 选择Maven 点击Next 3 输入项目名称 Name WebDemo3 点击 Finish 生成新的项
  • python中的__doc__,__name__

    模块的name 每个模块都有一个名称 在模块中可以通过语句来找出模块的名称 这在一个场合特别有用 就如前面所提到的 当一个模块被第一次输入的时候 这个模块的主块将被运行 假如我们只想在程序本身被使用的时候运行主块 而在它被别的模块输入的时候
  • 雅克比(Jacobi)方法

    转载 https www cnblogs com ytxwzqin p 9853781 html 雅克比 Jacobi 方法 可以用来求解协方差矩阵的特征值和特征向量 雅可比方法 Jacobian method 求全积分的一种方法 把拉格朗
  • DTO 的替代品

    点击 终码一生 关注 置顶公众号 每日技术干货 第一时间送达 数据传输对象是在进程之间承载数据的对象 使用它的动机是进程之间的通信通常通过远程接口完成 其中每次调用都是昂贵的操作 由于每次调用的大部分成本都与客户端和服务器之间的往返时间有关