我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在 JSP 上将值直接绑定到它们(我使用的是 JSF)。或者在 DAO 或 Service 层将领域模型对象转换为 DTO,并将轻量级 DTO 发送到表示层。
我被告知使用 DTO 没有任何意义,因为对数据库的更改将导致对所有 DTO 的更改,而在任何地方使用模型对象只需要对受影响的模型对象进行更改。然而,DTO 的易用性和轻量级特性似乎超过了这一点。
我应该注意到我的应用程序使用 Hibernate 模型对象并使用它自己的自定义创建的模型对象(意味着不绑定到任何数据库会话,始终分离)。上述任何一种情况对严格的模型对象模式更有利吗?就延迟初始化异常之类的事情而言,使用 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]
}
但也许您不需要所有这些信息。你只需要老师的姓氏,他们今年教的学生人数,以及所有学生的平均 GPA 加起来。在那种情况下你会怎么做?检索完整的教师信息和学生关系,然后您的代码计算学生列表,然后计算其中所有 gpa 的总平均值?这似乎比简单地使用“String lastName”、“int numStudents”和“double combineGpa;”创建一个 DTO 更加努力;
这听起来像是我已经下定决心了,但我还没有在一个应用程序中工作,其中模型对象可以在每个实例中完全干净地使用。具有非同寻常的用户需求的常规现实世界应用程序无法以这种方式工作。