Jednym z powodów, dla których myślę, że ta dyskusja pojawia się wielokrotnie, jest to, że wydaje się, że poważnym problemem jest zabranie obiektu ze wszystkimi potrzebnymi danymi i przekonwertowanie go na obiekt, który wygląda identycznie lub prawie identycznie jak ten oddajesz.
To prawda, to PITA. Jest jednak kilka powodów (oprócz wymienionych powyżej).
- Obiekty domeny mogą stać się bardzo ciężkie i zawierać wiele bezużytecznych informacji do połączenia. To wzdęcie spowalnia interfejs użytkownika ze względu na wszystkie przesyłane dane, zestawiane / usuwane i analizowane. Kiedy weźmiesz pod uwagę, że FE będzie miało wiele linków odnoszących się do twoich usług internetowych i zostaniesz wywołany za pomocą AJAX lub innego wielowątkowego podejścia, szybko spowolnisz swój interfejs użytkownika. Wszystko to prowadzi do ogólnej skalowalności usług sieciowych
- Bezpieczeństwo może być łatwo zagrożone przez ujawnienie zbyt dużej ilości danych. Jako minimum możesz ujawnić adresy e-mail i numery telefonów użytkowników, jeśli nie wyeliminujesz ich z wyniku DTO.
- Uwagi praktyczne: Aby 1 obiekt został sparowany jako utrwalony obiekt domeny ORAZ DTO, musiałby mieć więcej adnotacji niż kodu. Będziesz miał wiele problemów z zarządzaniem stanem obiektu przechodzącego przez warstwy. Ogólnie rzecz biorąc, jest to bardziej PITA do zarządzania niż po prostu robienie nudnego kopiowania pól z obiektu domeny do DTO.
Ale możesz zarządzać nim dość skutecznie, jeśli zamkniesz logikę tłumaczenia w zbiór klas konwerterów
Spójrz na lambdaJ, w którym możesz wykonać konwersję (domainObj, toDto). Jest przeciążenie tego do użytku z kolekcjami. Oto przykład metody kontrolera, która z niej korzysta. Jak widać, nie wygląda tak źle.
@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);
}