Salah satu alasan saya pikir diskusi ini muncul berulang kali adalah karena tampaknya seperti kesakitan serius untuk mengambil objek dengan semua data yang Anda butuhkan dan mengubahnya menjadi objek yang terlihat identik atau hampir identik dengan yang ada. kamu menyerahkan
Memang benar, itu adalah PITA. Tetapi ada beberapa alasan (selain yang disebutkan di atas) untuk melakukannya.
- Objek domain bisa menjadi sangat berat dan mengandung banyak informasi yang tidak berguna untuk panggilan. Kembung ini memperlambat UI karena semua data dikirimkan, disusun / tidak dikunci dan diuraikan. Ketika Anda mempertimbangkan FE akan memiliki banyak tautan yang merujuk ke layanan web Anda dan dipanggil dengan AJAX atau pendekatan multi-utas lainnya, Anda akan dengan cepat membuat UI Anda lamban. Semua ini sampai pada skalabilitas umum layanan web
- Keamanan dapat dengan mudah dikompromikan dengan mengekspos terlalu banyak data. Minimal Anda dapat mengekspos alamat email dan nomor telepon pengguna jika Anda tidak menghilangkannya dari hasil DTO.
- Pertimbangan praktis: Untuk 1 objek yang diarak sebagai objek domain yang bertahan DAN DTO, ia harus memiliki lebih banyak anotasi daripada kode. Anda akan memiliki sejumlah masalah dengan mengelola keadaan objek saat melewati lapisan. Secara umum ini menjadi jauh lebih PITA untuk mengelola kemudian hanya melakukan kebosanan menyalin bidang dari objek domain ke DTO.
Tetapi, Anda dapat mengelolanya dengan cukup efektif jika Anda merangkum logika terjemahan ke dalam kumpulan kelas konverter
Lihat lambdaJ di mana Anda dapat melakukan 'convert (domainObj, toDto)' ada kelebihan ini untuk digunakan dengan koleksi. Berikut adalah contoh metode pengontrol yang memanfaatkannya. Seperti yang Anda lihat, itu tidak terlihat terlalu buruk.
@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);
}