dto与dto相互转换_在DTO上

dto与dto相互转换

通常使用DTO或数据传输对象 。 什么不是s? 众所周知,它们源自DDD(域驱动设计)。 在那里很有意义–域对象具有状态,身份和业务逻辑,而DTO仅具有状态。

但是,当今许多项目正在使用贫血数据模型方法( 我认为 ),并且仍在使用DTO。 每当对象“离开”服务层或“离开”系统时(通过Web服务,rmi等),都将使用它们。 有三种方法:

  • 每个实体至少具有一个对应的DTO。 对于视图层中的不同方案,通常不止一个。 在列表中显示用户时,您会有一个DTO,而在“用户详细信息”窗口中显示时,则需要一个扩展的DTO。 我不赞成这种方法,因为在很多情况下,DTO和域结构具有完全相同的结构,因此,存在很多重复的代码+冗余映射。 另一件事是多个DTO的可变性。 即使它们与实体不同,它们在一个或两个字段之间也彼此不同。 为什么重复是一件坏事? 因为要在两个地方进行更改,所以当数据通过多个对象时,很难跟踪问题,并且因为它是重复的。 在同一项目中复制和粘贴是一种罪过。
  • 仅当DTO的结构与实体的结构明显不同时才创建DTO。 在所有其他情况下,都使用实体本身。 您不希望显示某些字段的情况(尤其是在通过Web服务公开给第三方的情况下)存在,但并不常见。 有时可以通过序列化机制来处理(例如,将其标记为@JsonIgnore@XmlTransient) ,但在其他情况下,结构则有所不同。 在这些情况下,应有DTO。 例如,您有一个User和UserDetails,其中UserDetails保存详细信息+当前登录用户与给定用户的关系。 后者与实体无关,因此您创建一个DTO。 但是,对于DirectMessage,在数据库和UI中都具有发件人,收件人,文本和日期时间。 无需DTO。

    使用此方法的一个警告(以及下一个警告)。 贫血的实体通常带有ORM(对于Java,则为JPA)。 每当它们退出服务层时,由于需要开放会话的惰性集合,它们可能无效。 您在这里有两个选择:

    • 使用OpenSessionInView / OpenEntityManagerInView –这样,会话将保持打开状态,直到您准备好响应为止。 这很容易配置,但不是我的首选-它以一种微妙的方式违反了层边界,这有时会导致问题,特别是对于新手开发人员
    • 不要使用惰性集合。 不需要延迟收集。 如果他们应该保留一小部分项目(例如,用户角色列表),或者如果数据可能会增长而使用查询,要么让他们渴望。 是的,无论如何您都不会显示1000条记录,您必须对其进行分页。 如果没有惰性关联(默认情况下@@ ToOne渴望),则在关闭会话时不会有无效的对象
  • 完全不使用DTO。 没有明显变化的结构,请尽快应用。 对于较小的项目,这通常是一个好方法。 上面提到的所有内容都适用于此。

因此,我首选的方法是“ 中间方法 ”。 但是在每种情况下都需要考虑很多因素,这可能不适用于规模较大和/或经验较少的团队。 因此,应该选择两个“极端”之一。 由于还需要考虑“无DTO”方法-做@Transient是什么,惰性集合如何影响流量等,因此通常选择“所有DTO”。 但是,尽管这似乎是最安全的方法,但仍有很多陷阱。

首先,您如何从DTO映射到实体,反之亦然? 三种选择:

  • 专用的映射器类
  • 构造函数– DTO构造函数接受实体并填充自身,反之亦然(记住也要提供默认的构造函数)
  • 声明性映射(例如Dozer )。 这实际上与第一个选项相同–它外部化了映射。 它甚至可以与专用的映射器类一起使用
  • 串联映射它们(必要时)。 这可能会生成无法维护的代码,因此不是首选

我更喜欢构造方法,至少是因为创建的类更少。 但是它们本质上是相同的(DTO并不以封装闻名,因此您的所有属性无论如何都公开)。 这是使用DTO和两种“映射”方法时的准则列表:

  • 不要生成过多的冗余代码。 如果两种情况需要稍微不同的DTO,请重用。 无需为一两个字段之间的差异创建新的DTO
  • 不要将表示逻辑放在映射器/构造函数中。 例如,如果( entity.isActive()dto.setStatus(“ Active”); 这应该在视图层中发生
  • 不要将实体与DTO一起偷偷摸摸。 DTO不应具有作为实体的成员。 通常,不应在服务层之外使用实体(这有点极端,但是如果我们在所有地方都使用DTO,则应该保持一致并坚持这种做法)
  • 不要在控制器中使用mappers / entity-to-dto构造函数,而在服务层中使用它们。 首先使用DTO的原因是实体可能是ORM绑定的,并且它们可能在会话外部(即服务层外部)无效。
  • 如果使用映射器,则首选静态映射器方法。 映射器没有状态,因此不需要实例化它们。 (而且不必嘲笑,包装等)。
  • 如果使用映射器,则无需为每个实体(+多个DTO)使用单独的映射器。 可以将相关实体分组在一个映射器中。 例如CompanyCompanyProfileCompanySubsidiary可以使用相同的映射器类

只需确保在项目开始时就做出所有这些决定,然后确定哪种情况适用于您的方案(团队规模和经验,项目规模,领域复杂性)。

参考: 在的DTO从我们JCG伙伴 Bozho在Bozho的科技博客 。

相关文章 :

  • Spring和AspectJ的领域驱动设计
  • 在域驱动设计中使用状态模式
  • ORM问题
  • 什么是依赖倒置? 是IoC吗?
  • 框架使开发人员愚蠢吗?
  • 每个程序员都应该知道的事情
  • JDK中的设计模式
  • Java最佳实践

翻译自: https://www.javacodegeeks.com/2011/09/on-dtos.html

dto与dto相互转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据...

动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据:由存储过程决定,如果编写的存储过程可以生成需要呈现的表格则直接绑定,否则要动态生成表格转载于:https://www.cnblogs.com/yzl495/p/4269571.html

【APICloud系列|1】华为应用市场 应用版权证书或代理证书怎么填

将apk上传到华为应用市场 首页提交的时候是没有问题的,但是第二次需要更新的时候发现多了一个必填的选项 我的应用被打回来啦,说明这个免责函需要要填写。今天公章还不在公司,还着急上线,不能准时上线就扣20%的工资。

Lambdas中的例外:有点混乱的优雅解决方案

考虑以下用于写入文件的功能: 该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStream , SnappyOuputStream (快速压缩)或简单的FileIn…

linux ub查看ftp安装,Linux Ubuntu 18.04 安装 FTP服务

安装更新数据源 : apt-get update安装FTP: sudo apt-get install vsftpd服务启动FTP服务: sudo service vsftpd startTip可以使用screen后台运行服务停止FTP服务: sudo service vsftpd stop查看FTP服务状态: sudo service vsftpd status配置新建用户新建/home/uftp目录作为用户…

图片上的文字怎么转换为word

图片上的文字怎么转换为word 很多软件因为自身技术不成熟所有对使用环境操作步骤等有诸多的要求,使得用户使用的时候很不方便。一般的ocr文字识别软件不能在win7系统中使用,有的时候要使用这个软件还要重装系统或是找一台xp系统的电脑,使用受…

【APICloud系列|2】上架安卓应用商店全套流程(小米应用商店、华为应用市场、阿里应用商店、百度手机助手、腾讯应用宝)

​​本次主要讲解前5个平台上架流程及注意事项(注册登录信息自行准备) 1. 腾讯应用宝:http://open.qq.com/ 2. 阿里应用商店(淘宝手机助手,UC应用商店,豌豆荚):http://open.uc.cn/ 3. 百度手机助手:http://app.baidu.com/ 4. 华为应用市场:http://developer.huaw…

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,…

linux基于域名的虚拟主机,Nginx虚拟主机应用——基于域名、IP、端口的虚拟主机...

Nginx支持的虚拟主机有三种●基于域名的虚拟主机●基于IP的虚拟主机●基于端口的虚拟主机每一种虚拟主机均可通过“server{}" 配置段实现各自的功能基于域名的虚拟主机实验环境1.基础源码包(无密码):https://pan.baidu.com/s/14WvcmNMC6CFX1SnjHxE7JQ2.CentOS 7版本Linux虚…

解决Chrome谷歌浏览器″Adobe Flash Player 插件已被屏蔽″的问题

​​解决Chrome谷歌浏览器"Adobe Flash Player 插件已被屏蔽"的问题如果你确定在电脑上确实已经安装了 Adobe Flash Player 插件,但是打开网页时仍然提示"已屏蔽 Adobe Flash Player 插件" ,你可以试试修改下面这两个选项&#xff0…

powermock模拟对象_使用PowerMock测试对象的内部状态

powermock模拟对象大多数单元测试都集中于测试对象的行为以证明其有效。 这可以通过编写一个JUnit测试来实现,该测试调用对象的公共方法,然后测试这些调用的返回值是否与先前定义的一组期望值匹配。 这是一种非常常见且成功的技术。 但是,不应…

Mono for android,Xamarin点击事件的多种写法

(一)原本java的写法(相信很多是学过java的): 需要实现接口View.IOnClickListener,最好也继承类:Activity,因为View.IOnClickListener接口又继承了IJavaObject, IDisposable接口&…

51个赚钱的好方法

有很多方法赚钱。你可以在家工作,你可以做各种自由职业者,你可以在博客,也可以只保存。时间紧迫,我不知道任何人谁不喜欢做一些额外的现金。所以,我得给你51如何赚钱最好的方法的列表。 1.作为自由职业者的工作 工作作…

一句话木马绕过linux安全模式,一句话木马(webshell)是如何执行命令的

在很多的渗透过程中,渗透人员会上传一句话木马(简称webshell)到目前web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此,那么一句话木马到底是如何执行的呢,下面我们就对webshell进行一个简单的分析。首先我们先看…

如何从finally块访问方法的结果值

尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时,在极少数情况下,它也会非常有用。 一个例子 方法结果值放在堆栈中。 如果查看以下示例: public int method() {if (something)retu…

第六章 Qt布局管理器Layout

第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置。当用户改变窗口的大小,组件还静静地呆在原来的位置,这有时候显然…

kafka集群状态Linux,Kafka集群配置

本文只要讲述Kafka集群的配置事项,包括zookeeper集群的配置。本文讲述的前提是kafka和zookeeper在单机情况下已正确安装和配置。如有疑问,可以参考《Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka》。假设集群中有三台机器, i…

【APICloud系列|36】小米应用商店可以检测同个应用不同版本信息

在小米应用商店上架的信息 在其他应用商店上架的信息,比如应用宝 小米发过来的友好提示邮件:

VLAN的Hybrid和Trunk端口有何区别

有网友问这样一个问题: vlan 1 vlan 2 vlan 3 vlan 4 vlan 5 interface Ethernet0/1 port link-type hybrid port hybrid vlan 1 to 4 untagged port hybrid pvid vlan 2 interface Ethernet0/2 port link-type hybrid port hybrid vlan 3 to 5 untagged port hybri…

【APICloud系列|35】小米应用商店版本更新

1.在小米应用商店后天重新上传一个更新加固已经签名的安装包。 链接地址:https://dev.mi.com 2.完善资料,只需要填写更新日志简单说明更新的缘由,再次选择相应的语言即可。原来的内容还是存在的。 3.提交审核就行。

Linux光盘检测,qpxtool

软件简介各位使用Linux系统的刻录发烧友有福了。不用再为了检测光碟品质而切换到Windows系统了。因为在Linux系统里也有支持光碟品质检测的软件!它的名字是QPxTool。虽说05年底QPxTool就诞生了,但最近才被以rpm包的形式提供给Fedora用户。首先看下它的界…