Uno dei motivi per cui penso che questa discussione si presenti ripetutamente è perché sembra un serio rompicapo prendere un oggetto con tutti i dati necessari e convertirlo in un oggetto che sembra identico o quasi identico a quello che stai consegnando.
È vero, è un PITA. Ma ci sono alcune ragioni (oltre a quelle elencate sopra) per farlo.
- Gli oggetti di dominio possono diventare molto pesanti e contenere molte informazioni inutili per la chiamata. Questo ingigantimento rallenta l'interfaccia utente a causa di tutti i dati trasmessi, sottoposti a marshalling / unmarshalled e analizzati. Quando consideri che un FE avrà numerosi link che si riferiscono ai tuoi servizi web e che sono stati chiamati con AJAX o qualche altro approccio multi-thread, la tua interfaccia diventerà presto pigra. Tutto questo arriva alla generale scalabilità dei servizi web
- La sicurezza può essere facilmente compromessa esponendo troppi dati. Come minimo, potresti esporre indirizzi e-mail e numeri di telefono degli utenti se non li elimini dal risultato DTO.
- Considerazioni pratiche: per 1 oggetto da sfoggiare come oggetto di dominio persistente E un DTO dovrebbe avere più annotazioni del codice. Avrai un numero qualsiasi di problemi con la gestione dello stato dell'oggetto mentre passa attraverso i livelli. In generale, questo è molto più di un PITA per gestire quindi semplicemente il tedio di copiare i campi da un oggetto dominio a un DTO.
Tuttavia, puoi gestirlo in modo abbastanza efficace se incapsuli la logica di traduzione in una raccolta di classi di convertitori
Dai un'occhiata a lambdaJ dove puoi fare 'convert (domainObj, toDto)' c'è un sovraccarico di questo da usare con le collezioni. Ecco un esempio di un metodo controller che ne fa uso. Come puoi vedere, non sembra così male.
@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);
}