嗨,我正在开发一个需要使用Hibernate处理复杂域模型的应用程序.这个应用程序使用Spring MVC并且在表示层中使用域对象非常混乱,所以我认为我应该使用DTO来往于我的服务层,以便这些匹配我在视图中所需的内容.现在假设我有一个CarLease实体,其属性不是简单的java原语,但它与Make,Model等其他实体组成
public class CarLease {
private Make make;
Private Model model;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
大多数属性都是以这种方式使用,并且可以使用jsp视图上的下拉选项进行选择,每个属性都会将ID发回控制器.
现在考虑一些标准用例:创建,编辑,显示
您将如何建模演示文稿DTO用作表单支持对象以及表示层和服务层之间的通信?
你会为每个案例创建一个不同的DTO(创建,编辑,显示),你会为复杂属性制作DTO吗?如果是这样,您将ID转换为实体?
如何以及在何处处理验证,DTO /域组装,您将从服务层方法返回什么?(创建,编辑,获取)
正如您所看到的,现在我将通过将我的视图与域对象分开来获益(非常复杂,有很多我不需要的东西.)但是我很难找到任何真实世界的例子和最佳实践.我需要从上到下的一些架构指导,请记住我将使用Spring MVC,以防可能利用你的anwser.
提前致谢.
在我的Spring MVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中.DTO被用作弹簧形式的背衬物体.
因此我的服务看起来像这样:
userService.storeUser(NewUserRequestDTO req);
Run Code Online (Sandbox Code Playgroud)
服务层将翻译DTO - > Domain对象并完成剩下的工作.
现在我的问题是,当我想从服务中检索DTO来执行更新或显示我似乎无法找到更好的方法来执行它然后有多个方法进行查找返回不同的DTO类似.. .
EditUserRequestDTO userService.loadUserForEdit(int id);
DisplayUserDTO userService.loadUserForDisplay(int id);
Run Code Online (Sandbox Code Playgroud)
但这种做法并不合适.也许服务不应该返回像EditUserRequestDTO这样的东西,控制器应该负责从专用表单对象组装requestDTO,反之亦然.
究其原因也有单独的DTO的是DisplayUserDTO是强类型为只读,也有一些是从查找表的实体在DB(如市,州)的用户很多属性,因此DisplayUserDTO本来的字符串描述属性,而EditUserRequestDTO将具有将支持表单中的选择下拉列表的id.
你怎么看?
谢谢