我认为这一讨论反复出现的原因之一是,将一个对象与您需要的所有数据一起转换为与该对象看起来相同或几乎相同的对象似乎是一件痛苦的事。你正在交接。
是的,这是PITA。但是这样做有几个原因(除了上面列举的原因之外)。
- 域对象可能变得很重,并且包含许多无用的信息供调用。由于所有传输,整理/解组和解析的数据,这种膨胀会使UI变慢。当您考虑到FE将有许多链接指向您的Web服务并被AJAX或其他多线程方法调用时,您很快就会使UI呆滞。所有这些都可以提高Web服务的总体可扩展性
- 公开太多数据很容易损害安全性。如果您不从DTO结果中删除用户的电子邮件地址和电话号码,则至少可以公开它们。
- 实际考虑:对于1个要作为持久域对象和DTO进行游行的对象,它必须具有比代码更多的注释。当对象穿过层时,在管理对象状态时会遇到许多问题。通常,这是PITA的管理要多得多,然后只需执行将字段从域对象复制到DTO的繁琐工作即可。
但是,如果将转换逻辑封装到转换器类的集合中,则可以相当有效地进行管理。
看看lambdaJ,您可以在其中执行“ convert(domainObj,toDto)”操作,其中有很多用于集合的方法。这是一个使用它的控制器方法的示例。如您所见,它看起来还不错。
@GET
@Path("/{id}/surveys")
public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {
checkDateRange(from, to);
MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);
}