我知道这可能是一个古老的问题,但是更好的做法是什么? 在整个应用程序的所有层中使用一个领域模型对象,甚至直接将值绑定到JSP上(我使用的是JSF)。 或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级DTO发送到表示层。 我被告知,使用DTO是没有意义的,因为对数据库的更改将导致所有DTO的更改,而在任何地方使用模型对象只需要更改受影响的模型对象。 但是,DTO的易用性和轻便性似乎超过了这一点。 我应该注意到,我的应用程序使用Hibernate模型对象,并使用自己的自定义创build的模型对象(意思是不绑定到任何数据库会话,总是分离)。 上述任何一种情况对于严格的模型对象模式都更有利? 对于Lazy Initialization Exceptions这样的事情来说,使用Hibernate是一个巨大的PITA。 我正在编辑这个问题,希望进一步讨论(不知道我是否正确): 我对模型对象的问题是它们根本不灵活。 下面的评论说应该devise应用程序,以便模型对象可以在所有图层中使用。 为什么? 如果一个用户想要一个荒谬的function,我应该告诉他们,“那么将无法与模型对象? 简单而简单,有时候模型对象不能工作。 你可能有: public class Teacher { List<Student> students; [tons of other Teacher-related fields] } public class Student { double gpa; [tons of other Student-related fields] } 但也许你不需要所有的信息。 你只需要老师的姓氏,他们今年教的学生人数,以及所有学生平均GPA的总和。 你会怎么做呢? 检索完整的教师信息和学生关系,然后你的代码在学生名单上得到一个计数,然后计算所有gpas的总平均数? 这似乎更像是花了更多的努力,而不是简单地创build一个“stringlastName”,“int numStudents”,和“double combinedGpa; 这可能听起来像我的思想已经弥补了这些,但我还没有在一个应用程序中的模型对象可以在任何情况下完全使用干净。 普通的真实世界的应用与普通的用户需求不一样。
域驱动devise的一部分,似乎没有很多细节,是如何以及为什么你应该从你的界面隔离你的域模型。 我试图说服我的同事,这是一个很好的做法,但我似乎没有取得多大进展。 他们在演示和界面层中使用的领域实体。 当我向他们争辩说,他们应该使用显示模型或DTO来隔离域层和界面层时,他们反驳说他们没有看到这样做的业务价值,因为现在你有一个UI对象来维护以及原来的域对象。 所以我正在寻找一些我可以用来支持的具体原因。 特别: 为什么我们不应该在表示层中使用域对象? (如果答案是显而易见的,“解耦”,那么请解释为什么在这方面这很重要) 我们是否应该使用额外的对象或构造来隔离我们的域对象与接口?
我最近听到有人说数据传输对象 (DTO)是反模式的 。 为什么? 有什么select?