ฉันต้องการถามคำถามเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับประเภทการแมปและใช้วิธีการขยายใน C # ฉันรู้ว่าหัวข้อนี้มีการพูดคุยกันหลายครั้งในช่วงไม่กี่ปีที่ผ่านมา แต่ฉันได้อ่านบทความจำนวนมากและยังมีข้อสงสัย
ปัญหาที่ฉันพบคือการขยายคลาสที่ฉันเป็นเจ้าของด้วยฟังก์ชัน "แปลง" สมมติว่าฉันมีคลาส "บุคคล" ที่แสดงถึงวัตถุซึ่งจะถูกใช้โดยตรรกะบางอย่าง ฉันยังมีคลาส "ลูกค้า" ที่แสดงการตอบสนองจาก API ภายนอก (จริง ๆ แล้วจะมีมากกว่าหนึ่ง API ดังนั้นฉันต้องแมปการตอบสนองของ API แต่ละประเภททั่วไป: คน) ฉันสามารถเข้าถึงซอร์สโค้ดของทั้งชั้นเรียนและในทางทฤษฎีสามารถใช้วิธีการของตัวเองที่นั่น ฉันต้องการแปลงลูกค้าเป็นบุคคลเพื่อให้ฉันสามารถบันทึกลงในฐานข้อมูล โครงการไม่ได้ใช้ผู้ทำแผนที่อัตโนมัติใด ๆ
ฉันมีวิธีแก้ปัญหาที่เป็นไปได้ 4 ประการ:
.ToPerson () วิธีการในระดับผู้บริโภค มันเรียบง่าย แต่ดูเหมือนว่าจะแบ่งรูปแบบความรับผิดชอบเดียวให้ฉันโดยเฉพาะอย่างยิ่งระดับ Consumer ถูกแมปกับคลาสอื่น ๆ (บางอันต้องการโดย API ภายนอกอื่น) ด้วยดังนั้นจึงต้องมีวิธีการทำแผนที่หลายวิธี
การสร้างคอนสตรัคในคลาสบุคคลรับ Consumer เป็นอาร์กิวเมนต์ ง่ายและดูเหมือนว่าจะทำลายรูปแบบความรับผิดชอบเดียว ฉันต้องมีตัวสร้างการแมปหลายตัว (เนื่องจากจะมีคลาสจาก API อื่นให้ข้อมูลเดียวกับผู้บริโภค แต่ในรูปแบบที่แตกต่างกันเล็กน้อย)
แปลงระดับด้วยวิธีการขยาย วิธีนี้ฉันสามารถเขียน. ToPerson () วิธีการสำหรับระดับผู้บริโภคและเมื่อมีการแนะนำ API อื่นที่มีคลาส NewConsumer ของตัวเองฉันสามารถเขียนวิธีการขยายอื่นและเก็บไว้ในไฟล์เดียวกัน ฉันเคยได้ยินความเห็นว่าวิธีการต่อเติมเป็นสิ่งที่ชั่วร้ายโดยทั่วไปและควรใช้เฉพาะเมื่อจำเป็นอย่างยิ่งเท่านั้นนั่นคือสิ่งที่ทำให้ฉันกลั้น มิฉะนั้นฉันชอบวิธีนี้
คลาส Converter / Mapper ฉันสร้างคลาสแยกต่างหากที่จะจัดการการแปลงและใช้วิธีการที่จะใช้อินสแตนซ์ของคลาสซอร์สเป็นอาร์กิวเมนต์และส่งคืนอินสแตนซ์ของคลาสปลายทาง
เพื่อสรุปปัญหาของฉันสามารถลดจำนวนคำถามได้ (ตามบริบทที่ฉันอธิบายไว้ด้านบน):
การวางวิธีการแปลงภายในวัตถุ (POCO?) (เช่น. ToPerson () วิธีการในระดับผู้บริโภค) ถือว่าเป็นการทำลายรูปแบบความรับผิดชอบเดียวหรือไม่
การใช้คอนสตรัคเตอร์คอนสตรัคเตอร์ในคลาส (เหมือน DTO) ถือว่าเป็นการทำลายรูปแบบความรับผิดชอบเดี่ยวหรือไม่? โดยเฉพาะอย่างยิ่งหากคลาสดังกล่าวสามารถถูกแปลงจากแหล่งที่มาหลายประเภทดังนั้นคอนสตรัคเตอร์การแปลงหลายรายการจึงต้องการ
การใช้วิธีการขยายในขณะที่มีการเข้าถึงรหัสต้นฉบับของคลาสถือว่าเป็นการปฏิบัติที่ไม่ดีหรือไม่? พฤติกรรมดังกล่าวสามารถใช้เป็นรูปแบบที่ทำงานได้สำหรับการแยกตรรกะหรือมันเป็นรูปแบบการต่อต้าน?
Person
ชั้นเรียน DTO? มันมีพฤติกรรมใด ๆ