Una de las razones por las que creo que esta discusión surge repetidamente es porque parece un gran dolor de cabeza tomar un objeto con todos los datos que necesita y convertirlo en un objeto que se vea idéntico o casi idéntico al que estás entregando
Es verdad, es una PITA. Pero hay algunas razones (además de las enumeradas anteriormente) para hacerlo.
- Los objetos de dominio pueden volverse muy pesados y contener mucha información inútil para la llamada. Esta hinchazón ralentiza la interfaz de usuario debido a todos los datos transmitidos, ordenados / desglosados y analizados. Cuando considere que una FE tendrá numerosos enlaces que hacen referencia a sus servicios web y que se le llame con AJAX o algún otro enfoque de subprocesos múltiples, rápidamente hará que su IU sea lenta. Todo esto llega a la escalabilidad general de los servicios web
- La seguridad puede verse comprometida fácilmente al exponer demasiados datos. Como mínimo, podría exponer las direcciones de correo electrónico y los números de teléfono de los usuarios si no los elimina del resultado DTO.
- Consideraciones prácticas: para que 1 objeto desfile como un objeto de dominio persistente Y un DTO, debería tener más anotaciones que código. Tendrá varios problemas con la administración del estado del objeto a medida que pasa a través de las capas. En general, esto es mucho más de una PITA para administrar que simplemente hacer el tedio de copiar campos de un objeto de dominio a un DTO.
Pero puede administrarlo de manera bastante efectiva si encapsula la lógica de traducción en una colección de clases de convertidor
Eche un vistazo a lambdaJ donde puede hacer 'convertir (domainObj, toDto)', hay una sobrecarga de esto para usar con colecciones. Aquí hay un ejemplo de un método de controlador que lo utiliza. Como puede ver, no se ve tan mal.
@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);
}