什么是数据传输对象?
在MVC中是模型类DTO,如果没有,有什么不同,我们是否需要两者?
architecture model-view-controller data-transfer data-transfer-objects dto
我最近听到人们说数据传输对象(DTO)是一种反模式.
为什么?有哪些替代方案?
域驱动设计的一部分似乎没有太多细节,是您应该如何以及为什么要将域模型与界面隔离开来.我试图说服我的同事,这是一个很好的做法,但我似乎没有取得多大进展......
他们在演示文稿和界面层中随意使用域实体.当我向他们争辩说他们应该使用显示模型或DTO来将Domain层与接口层隔离时,他们反驳说他们在做类似的事情时看不到业务价值,因为现在你有一个UI对象要维护以及原始域对象.
所以我正在寻找一些可以用来支持它的具体原因.特别:
architecture design-patterns domain-driven-design data-transfer-objects presentation-layer
我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上直接将值绑定到它们(我使用的是JSF).或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级DTO发送到表示层.
我被告知使用DTO是没有意义的,因为对数据库的更改将导致所有DTO的更改,而在任何地方使用模型对象只需要更改受影响的模型对象.然而,DTO的易用性和轻量级特性似乎超过了这一点.
我应该注意我的应用程序使用Hibernate模型对象并使用自己的自定义创建的模型对象(意味着没有绑定到任何数据库会话,总是分离).以上任一方案对严格的模型对象模式更有利吗?对于像Lazy Initialization Exceptions这样的事情,使用Hibernate是一个巨大的PITA.
我正在编辑这个问题,希望能够进一步讨论(不确定我是否正确行事):
我对模型对象的问题在于它们根本不灵活.下面的评论说应该设计应用程序,以便可以在所有层中使用模型对象.为什么?如果用户想要一个荒谬的功能,我应该告诉他们,"好吧,这对模型对象不起作用"?
简单而简单,有时候模型对象不起作用.你可能有:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
Run Code Online (Sandbox Code Playgroud)
但也许你不需要所有这些信息.您只需要教师的姓氏,他们今年教授的学生人数,以及所有学生的平均GPA.在那种情况下你会做什么?检索完整的教师信息和学生关系,然后您的代码计入学生列表,然后计算内部所有gpas的总平均值?这似乎比简单地使用'String lastName','int numStudents'和'double combinedGpa'创建DTO更加努力;
听起来好像我已经考虑到了这些,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全使用.具有不同寻常的用户需求的常规实际应用程序不能以这种方式工作.
在这种情况下,您有一个客户端库传递给API的"传输对象"(POJO只有getter/setter),命名传输对象的最佳方法是什么?
package com.x.core;
public class Car {
private String make;
private String model;
public Car(com.x.clientapi.Car car) {
this.make = car.getMake();
this.model = car.getModel();
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,您的主类和传输对象都具有名称Car.它们在不同的包装中,但我认为使用相同的名称令人困惑.有关如何命名传输对象的最佳实践吗?
能否用简单的术语解释Transfer对象和Domain对象之间的区别?如果你能给出一个Java例子,那就太棒了..
我有类似的问题和关注如何在Web服务返回的Hibernate实体和数据传输对象之间进行转换,如本问题所述:
这里提到的一个因素是,如果域模型发生变化,一组DTO将在Web服务的情况下保护消费者.
即使它似乎会为我的项目添加大量代码,但这种推理似乎是合理的.
有没有一个好的设计模式可以用来将Hibernate实体(实现接口)转换为实现相同接口的DTO?
因此,假设以下两个实现'Book',我需要将BookEntity.class转换为BookDTO.class,以便我可以让JAXB序列化并返回.
同样,这整个前景对我来说似乎都很可疑,但如果有很好的模式来帮助处理这种转换,我很乐意获得一些见解.
是否有一些有趣的方式通过反射转换?还是一个我没想过的"建设者"模式?
我应该忽略DTO模式并传递实体吗?
我今天意识到我已经盲目地按照这个要求多年没有真正问过为什么.今天,我遇到了一个NotSerializableException和我从头开始创建的模型对象,我意识到足够了.
我被告知这是因为负载均衡服务器之间的会话复制,但我知道我在会话范围内看到了其他没有实现Serializable的对象.这是真正的原因吗?
我尊重的一位导师认为,简单的bean浪费时间 - 值对象"必须"包含一些有用的业务逻辑.
另一个人说这样的代码难以维护,并且所有业务逻辑都必须外部化.
我意识到这个问题是主观的.无论如何要求 - 想从更多角度了解答案.
我知道DTO是一个数据传输对象,BO是一个业务对象.但是,它究竟意味着什么?我什么时候应该选择其中一个?从我的理解DTO仅用于传输数据而没有业务逻辑.这是否意味着DTO没有任何方法属性(getter和setter)?但是,它仍然具有BO的属性.有人可以解释一下吗?谢谢.