TL; DR:
DTO อธิบายถึงรูปแบบของการถ่ายโอนสถานะ POCO ไม่ได้อธิบายอะไรเลย เป็นอีกวิธีหนึ่งในการพูดว่า "object" ใน OOP มันมาจาก POJO (Java) ประกาศเกียรติคุณจาก Martin Fowler ผู้อธิบายเพียงแค่ว่ามันเป็นชื่อที่นักเล่น 'วัตถุ' เพราะ 'วัตถุ' ไม่ได้เซ็กซี่มาก
DTO เป็นรูปแบบวัตถุที่ใช้ในการถ่ายโอนสถานะระหว่างชั้นของความกังวล พวกเขาสามารถมีพฤติกรรม (เช่นในทางเทคนิคสามารถเป็น poco) ตราบใดที่พฤติกรรมนั้นไม่เปลี่ยนแปลงสถานะ ตัวอย่างเช่นมันอาจมีวิธีการที่ทำให้เป็นอันดับของตัวเอง
POCO เป็นวัตถุธรรมดา แต่สิ่งที่มีความหมายโดย 'ธรรมดา' คือมันไม่พิเศษ มันหมายความว่ามันเป็นวัตถุ CLR ที่ไม่มีรูปแบบโดยนัย ศัพท์ทั่วไป มันไม่ได้ทำงานกับกรอบอื่น ๆ ดังนั้นถ้า POCO ของคุณมี[JsonProperty]
หรือ EF ตกแต่งอยู่ทั่วทุกแห่งมันก็เป็นคุณสมบัติเช่นกันดังนั้นฉันจะยืนยันว่าไม่ใช่ POCO
นี่คือตัวอย่างของรูปแบบวัตถุชนิดต่าง ๆ เพื่อเปรียบเทียบ:
- ดูโมเดล : ใช้เพื่อสร้างโมเดลข้อมูลสำหรับมุมมอง มักจะมีคำอธิบายประกอบข้อมูลเพื่อช่วยในการผูกและการตรวจสอบ ใน MVVM มันยังทำหน้าที่เป็นตัวควบคุม มันเป็นมากกว่า DTO
- วัตถุค่า : ใช้เพื่อแสดงค่า
- Aggregate Root : ใช้เพื่อจัดการสถานะและค่าคงที่
- ตัวจัดการ : ใช้เพื่อตอบกลับเหตุการณ์ / ข้อความ
- คุณสมบัติ : ใช้เป็นของประดับตกแต่งเพื่อจัดการกับข้อกังวลข้าม
- บริการ : ใช้เพื่อทำงานที่ซับซ้อน
- Controller : ใช้สำหรับควบคุมการไหลของคำร้องขอและการตอบกลับ
- Factory : ใช้เพื่อกำหนดค่าและ / หรือรวบรวมวัตถุที่ซับซ้อนเพื่อใช้เมื่อตัวสร้างไม่ดีพอ นอกจากนี้ยังใช้ในการตัดสินใจว่าจะต้องสร้างวัตถุใดในรันไทม์
- Repository / DAO : ใช้เพื่อเข้าถึงข้อมูล
สิ่งเหล่านี้ล้วนเป็นแค่วัตถุ แต่สังเกตว่าส่วนใหญ่มักจะเชื่อมโยงกับลวดลาย ดังนั้นคุณสามารถเรียกพวกเขาว่า "วัตถุ" หรือคุณอาจเจาะจงเจาะจงมากขึ้นเกี่ยวกับเจตนาของมันและเรียกมันตามสิ่งที่มันเป็น นี่คือสาเหตุที่เรามีรูปแบบการออกแบบ เพื่ออธิบายแนวคิดที่ซับซ้อนในงานไม่กี่ DTO เป็นรูปแบบ รูทรวมเป็นรูปแบบ View Model เป็นรูปแบบ (เช่น MVC & MVVM) POCO ไม่ใช่รูปแบบ
POCO ไม่ได้อธิบายรูปแบบ มันเป็นวิธีที่แตกต่างในการอ้างถึงคลาส / วัตถุใน OOP คิดว่ามันเป็นแนวคิดที่เป็นนามธรรม พวกเขาสามารถอ้างถึงอะไร IMO มีความสัมพันธ์แบบทางเดียวเพราะเมื่อวัตถุมาถึงจุดที่สามารถให้บริการเพียงจุดประสงค์เดียวได้อย่างหมดจดแล้วก็ไม่ใช่ POCO อีกต่อไป ตัวอย่างเช่นเมื่อคุณทำเครื่องหมายชั้นเรียนของคุณด้วยของประดับตกแต่งเพื่อให้มันทำงานกับกรอบบางอย่างมันจะไม่เป็น POCO อีกต่อไป ดังนั้น:
- DTO คือ POCO
- POCO ไม่ใช่ DTO
- รูปแบบการดูเป็น POCO
- POCO ไม่ใช่ View Model
ประเด็นในการสร้างความแตกต่างระหว่างทั้งสองคือการรักษารูปแบบที่ชัดเจนและสอดคล้องกันในความพยายามที่จะไม่ข้ามความกังวลและนำไปสู่การมีเพศสัมพันธ์แน่น ตัวอย่างเช่นถ้าคุณมีออบเจ็กต์ธุรกิจที่มีวิธีการเปลี่ยนแปลงสถานะ แต่ตกแต่งด้วยนรกด้วยการตกแต่งของ EF สำหรับการบันทึกไปยัง SQL Server และ JsonProperty เพื่อให้สามารถส่งกลับไปยังจุดปลายทาง API ได้ วัตถุนั้นจะทนต่อการเปลี่ยนแปลงและมีแนวโน้มว่าจะถูกทิ้งให้เกลื่อนไปด้วยคุณสมบัติต่างๆ (เช่น UserId, UserPk, UserKey, UserGuid, ที่บางคนถูกทำเครื่องหมายว่าไม่ถูกบันทึกลงในฐานข้อมูลและอื่น ๆ ที่ทำเครื่องหมายว่าไม่ JSON ที่จุดสิ้นสุด API)
ดังนั้นถ้าคุณจะบอกฉันบางสิ่งบางอย่างเป็น DTO แล้วฉันอาจจะตรวจสอบให้แน่ใจว่ามันไม่เคยใช้สำหรับสิ่งอื่นใดนอกจากย้ายรัฐ หากคุณบอกฉันว่ามีบางอย่างเป็นโมเดลดูฉันอาจจะแน่ใจว่าไม่ได้ถูกบันทึกลงในฐานข้อมูล หากคุณบอกฉันว่ามีบางอย่างเป็นแบบจำลองโดเมนฉันอาจจะตรวจสอบให้แน่ใจว่าไม่มีสิ่งใดอ้างอิงนอกโดเมน แต่ถ้าคุณบอกฉันว่าบางสิ่งเป็น POCO คุณจะไม่บอกฉันจริง ๆ เลย