หนึ่งในเหตุผลที่ฉันคิดว่าการสนทนาครั้งนี้เกิดขึ้นซ้ำแล้วซ้ำอีกก็เพราะว่ามันดูเหมือนความเจ็บปวดในการเอาวัตถุที่มีข้อมูลทั้งหมดที่คุณต้องการและแปลงเป็นวัตถุที่มีลักษณะเหมือนหรือเกือบเหมือนกัน คุณกำลังแจก
มันเป็นเรื่องจริงมันเป็น PITA แต่มีเหตุผลเล็กน้อย (นอกเหนือจากที่ระบุข้างต้น) สำหรับการทำเช่นนั้น
- วัตถุโดเมนสามารถรับของหนักมากและมีข้อมูลที่ไร้ประโยชน์มากมายสำหรับการโทร การขยายตัวนี้จะทำให้ UI ช้าลงเนื่องจากการส่งข้อมูลทั้งหมด marshalled / unmarshalled และ parsed เมื่อคุณพิจารณา FE จะมีลิงค์จำนวนมากที่อ้างอิงถึงบริการเว็บของคุณและถูกเรียกด้วย AJAX หรือวิธีการมัลติเธรดอื่น ๆ คุณจะทำให้ UI ของคุณช้าลงอย่างรวดเร็ว ทั้งหมดนี้นำไปสู่ความสามารถในการขยายเว็บเซอร์ทั่วไป
- ความปลอดภัยสามารถถูกบุกรุกได้ง่ายโดยการเปิดเผยข้อมูลมากเกินไป อย่างน้อยที่สุดคุณสามารถเปิดเผยที่อยู่อีเมลและหมายเลขโทรศัพท์ของผู้ใช้หากคุณไม่ได้ลบออกจากผลลัพธ์ DTO
- ข้อควรพิจารณาเชิงปฏิบัติ: สำหรับ 1 วัตถุในการแห่เป็นวัตถุโดเมนที่คงอยู่และ DTO มันจะต้องมีคำอธิบายประกอบมากกว่ารหัส คุณจะมีปัญหาจำนวนมากในการจัดการสถานะของวัตถุในขณะที่ผ่านเลเยอร์ โดยทั่วไปนี่เป็น PITA จำนวนมากในการจัดการจากนั้นเพียงแค่ทำความน่าเบื่อของการคัดลอกเขตข้อมูลจากวัตถุโดเมนไปยัง DTO
แต่คุณสามารถจัดการได้อย่างมีประสิทธิภาพหากคุณใส่แค็ปซูลลอจิกการแปลเป็นชุดของคลาสตัวแปลง
ดู lambdaJ ที่คุณสามารถ 'แปลง (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);
}