为什么?有什么替代方案吗?
为什么?有什么替代方案吗?
一些项目将所有数据都复制了一遍。一份作为域对象,另一份作为数据传输对象。
这种重复造成了巨大的成本,因此架构需要从这种分离中获得巨大的好处才值得这样做。
"EJB 3.0中的DTO是一种反模式"(原链接目前已下线)指出:
在EJB 3.0之前的EJB规范中,Entity Beans的重量级特性导致了使用数据传输对象(DTO)等设计模式。DTO成为轻量级对象(本应该是实体bean本身),用于在各层间发送数据……现在的EJB 3.0规范使实体bean模型与普通的Java对象(POJO)相同。有了这个新的POJO模型,您将不再需要为每个实体或一组实体创建DTO……如果您想要跨层发送EJB 3.0实体,请让它们实现java.io.Serializable接口
OO纯粹主义者会说DTO是反模式,因为对象变成了数据表格的表示,而不是真正的领域对象。
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
这里还提到了一些 DTO 的滥用行为。http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
它们的起源是由于三层系统(通常使用EJB作为技术)作为在层之间传递数据的手段。大多数基于现代框架(如Spring)的Java系统采用了一种替代简化的方式,使用POJO作为领域对象(通常使用JPA等注解),在单个层中进行操作... 在这里使用DTO是不必要的。由于其可能被滥用,一些人认为DTO是反模式。它们经常在不必要的情况下使用。
这篇文章模糊地描述了一些滥用情况。
当您的所有领域对象都急切地加载关联对象时,DTO变得必不可少,而不是反模式。
如果您不制作DTO,则会将不必要的传输对象从业务层传输到客户端/ Web层。
为了限制此情况下的开销,最好传输DTO。
我认为人们的意思是,如果您将所有远程对象都实现为DTO,则可能会成为反模式。DTO仅仅是一组属性,如果您有大型对象,则即使您不需要或使用它们,也会传输所有属性。在后一种情况下,最好使用代理模式。