เป็นการยากที่จะสร้างแนวทางปฏิบัติที่ดีที่สุดสำหรับบางสิ่งที่ "ยืดหยุ่น" หรือเป็นนามธรรมในฐานะ DTO โดยพื้นฐานแล้ว DTO เป็นเพียงวัตถุสำหรับการถ่ายโอนข้อมูล แต่ขึ้นอยู่กับปลายทางหรือเหตุผลของการถ่ายโอนคุณอาจต้องการใช้ "แนวทางปฏิบัติที่ดีที่สุด" ที่แตกต่างกัน
ผมขอแนะนำให้อ่านรูปแบบของสถาปัตยกรรม Enterprise Application โดยมาร์ตินฟาวเลอร์ มีทั้งบทที่ทุ่มเทให้กับรูปแบบที่ DTO ได้รับส่วนที่มีรายละเอียดมาก
แต่เดิมพวกมันถูก "ออกแบบ" เพื่อใช้ในการโทรทางไกลที่มีราคาแพงซึ่งคุณน่าจะต้องการข้อมูลจำนวนมากจากส่วนต่าง ๆ ของตรรกะของคุณ DTOs จะทำการถ่ายโอนข้อมูลในสายเดียว
ผู้เขียนกล่าวว่า DTO ไม่ได้มีวัตถุประสงค์เพื่อใช้ในสภาพแวดล้อมท้องถิ่น แต่บางคนพบว่ามีประโยชน์สำหรับพวกเขา โดยปกติแล้วพวกมันจะถูกใช้เพื่อรวบรวมข้อมูลจาก POCO ที่แตกต่างกันในเอนทิตี้เดียวสำหรับ GUIs, API หรือเลเยอร์ที่แตกต่างกัน
ตอนนี้ด้วยการสืบทอดการใช้รหัสซ้ำเหมือนผลข้างเคียงของการสืบทอดมากกว่าวัตถุประสงค์หลัก ในทางกลับกันจะมีการนำโค้ดกลับมาใช้ใหม่เพื่อวัตถุประสงค์หลัก
บางคนแนะนำให้ใช้องค์ประกอบและการสืบทอดพร้อมกันโดยใช้จุดแข็งของทั้งคู่และพยายามลดจุดอ่อนของพวกเขา ต่อไปนี้เป็นส่วนหนึ่งของกระบวนการทางจิตของฉันเมื่อเลือกหรือสร้าง DTO ใหม่หรือคลาส / วัตถุใหม่สำหรับเรื่องนั้น:
- ฉันใช้การสืบทอดกับ DTO ภายในเลเยอร์เดียวกันหรือบริบทเดียวกัน DTO จะไม่สืบทอดจาก POCO แต่อย่างใด BLL DTO จะไม่สืบทอดจาก DAL DTO เป็นต้น
- หากฉันพบว่าตัวเองกำลังพยายามซ่อนเขตข้อมูลจาก DTO ฉันจะปรับโครงสร้างใหม่และอาจใช้องค์ประกอบแทน
- ถ้าเขตข้อมูลที่แตกต่างกันน้อยมากจากฐาน DTO คือทั้งหมดที่ฉันต้องการฉันจะใส่ใน DTO สากล Universal DTOs ใช้ภายในเท่านั้น
- POCO / DTO พื้นฐานแทบจะไม่ถูกใช้กับตรรกะใด ๆ วิธีการที่ฐานจะตอบสนองต่อความต้องการของลูก ๆ เท่านั้น ถ้าฉันจำเป็นต้องใช้ฐานฉันหลีกเลี่ยงการเพิ่มเขตข้อมูลใหม่ที่ลูก ๆ จะไม่ใช้
บางคนอาจไม่ใช่วิธีปฏิบัติที่ "ดีที่สุด" พวกเขาทำงานได้ดีสำหรับโครงการที่ฉันทำมา แต่คุณต้องจำไว้ว่าไม่มีขนาดที่เหมาะกับทุกคน ในกรณีของ DTO สากลที่คุณควรระวังลายเซ็นของฉันมีลักษณะเช่นนี้:
public void DoSomething(BaseDTO base) {
//Some code
}
หากวิธีใดต้องการ DTO ของตัวเองฉันจะทำการสืบทอดและโดยปกติการเปลี่ยนแปลงเดียวที่ฉันต้องทำคือพารามิเตอร์แม้ว่าบางครั้งฉันต้องขุดลึกลงไปสำหรับกรณีเฉพาะ
จากความคิดเห็นของคุณฉันได้รับว่าคุณกำลังใช้ DTO ที่ซ้อนกัน หาก DTO ที่ซ้อนกันของคุณมีเพียงรายการของ DTO อื่น ๆ ฉันคิดว่าสิ่งที่ดีที่สุดที่ต้องทำคือการแกะรายการออก
ขึ้นอยู่กับจำนวนข้อมูลที่คุณต้องการแสดงหรือทำงานด้วยอาจเป็นความคิดที่ดีที่จะสร้าง DTO ใหม่ที่ จำกัด ข้อมูล ตัวอย่างเช่นถ้า UserDTO ของคุณมีฟิลด์จำนวนมากและคุณต้องการเพียง 1 หรือ 2 มันอาจจะดีกว่าถ้าคุณมี DTO ที่มีเฉพาะฟิลด์เหล่านั้น การกำหนดเลเยอร์บริบทการใช้งานและยูทิลิตี้ของ DTO จะช่วยได้มากเมื่อออกแบบ