我知道这可能是一个古老的问题,但什么是更好的做法?在应用程序的所有层中使用域模型对象,甚至直接将值绑定到JSP上(我正在使用JSF)。或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级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]
}
但也许你不需要所有的信息。你只需要老师的姓氏,他们今年教的学生人数,以及所有学生的平均GPA总和。在这种情况下你会做什么?检索完整的教师信息和学生关系,然后你的代码在学生名单上计数,然后计算所有gpas的总平均数?这似乎比通过'String lastName','int numStudents'和'double combinedGpa'创建DTO更省力。
这可能听起来像我的想法已经弥补了这些,但我还没有在模型对象可以完全在每个实例中完全使用的应用程序中工作。普通的真实世界的应用程序不符合普通的用户需求,但并不是那样。
是的,我明白了。它看起来好像有时会增加不必要的复杂性。如果我有一个表示老师的对象,并且有时候我只需要头信息(姓名,地址),我必须发送一个半人口填充的域对象到前端。它只是一种误导,似乎不正确的我。 – sma 2010-04-21 13:43:27
@ smayers81 - 你为什么只在中途填充你的域对象?这听起来像是一种不必要的优化(当然,如果你已经进行了配置或者发现了一个问题,那当然不会)这听起来像你的问题的根源 - 对待你的域对象,如DTOs。为什么不把你的完全水合的域对象推到前端?如果你发现你有一个性能问题,那么你有一个DTO的例子(或者完全绕过自定义对象,并直接处理你的框架提供的任何记录集抽象)。 – 2010-04-28 16:41:54
因为我总是觉得,如果没有真正需要,通过网络发送所有数据。我认为这是Hibernate的懒惰理念背后的全部动力(我可能在那里错了) – sma 2010-04-30 00:32:29