ในเกือบทุกกรณีคีย์หลักไม่ได้เป็นส่วนหนึ่งของโดเมนธุรกิจของคุณ แน่นอนว่าคุณอาจมีบางสิ่งที่ผู้ใช้ต้องเผชิญกับวัตถุที่มีดัชนีเฉพาะ ( UserNameสำหรับผู้ใช้หรือOrderNumberสำหรับการสั่งซื้อ) แต่โดยส่วนใหญ่แล้วธุรกิจไม่จำเป็นต้องระบุวัตถุโดเมนด้วยค่าเดียวหรือชุดของค่า ผู้ใช้งานธุรการ แม้ในกรณีพิเศษเหล่านั้นโดยเฉพาะอย่างยิ่งถ้าคุณใช้ตัวระบุที่ไม่ซ้ำกันทั่วโลก (GUID)คุณจะต้องการหรือต้องการใช้คีย์สำรองแทนการเปิดเผยคีย์หลักเอง
ดังนั้นหากความเข้าใจของฉันเกี่ยวกับการออกแบบที่ขับเคลื่อนด้วยโดเมนนั้นมีความถูกต้องคีย์หลักไม่จำเป็นต้องใช้และดังนั้นจึงไม่ควรเปิดเผยและเป็นปัญหาที่ดี พวกเขาน่าเกลียดและตะคริวสไตล์ของฉัน แต่ถ้าเราเลือกที่จะไม่รวมคีย์หลักในรูปแบบโดเมนจะมีผลตามมา:
- อย่างไร้เดียงสาdata transfer objects (DTO)ที่ได้มาจากการรวมกันของแบบจำลองโดเมนจะไม่มีคีย์หลัก
- DTO ที่เข้ามาจะไม่มีคีย์หลัก
ดังนั้นจะปลอดภัยหรือไม่ที่จะบอกว่าถ้าคุณบริสุทธิ์และกำจัดคีย์หลักในโมเดลโดเมนของคุณจริง ๆ คุณควรเตรียมพร้อมที่จะรับมือกับทุกคำขอในแง่ของดัชนีที่ไม่ซ้ำกันในคีย์หลักนั้น
ใส่อีกวิธีหนึ่งซึ่งโซลูชั่นต่อไปนี้เป็นวิธีที่ถูกต้องในการจัดการกับการระบุวัตถุเฉพาะหลังจากลบ PK ในแบบจำลองโดเมน
- ความสามารถในการระบุวัตถุที่คุณต้องจัดการกับคุณลักษณะอื่น ๆ
- รับคีย์หลักกลับใน DTO; เช่นการกำจัด PK เมื่อทำการแมปจากการมีอยู่ไปยังโดเมนจากนั้นทำการรวม PK อีกครั้งเมื่อทำการแมปจากโดเมนไปยัง DTO
แก้ไข: มาสร้างคอนกรีตกันเถอะ
กล่าวว่ารูปแบบโดเมนของฉันคือVoIPProviderซึ่งรวมถึงสาขาที่ชอบName, Description, URLเช่นเดียวกับการอ้างอิงเช่นProviderType, และPhysicalAddressTransactions
ตอนนี้สมมติว่าฉันต้องการสร้างบริการบนเว็บที่จะอนุญาตให้ผู้ใช้ที่มีสิทธิ์จัดการVoIPProviderได้
บางทีรหัสที่ใช้งานง่ายอาจไม่มีประโยชน์ในกรณีนี้ ท้ายที่สุดแล้วผู้ให้บริการ VoIP เป็น บริษัท ที่มีชื่อแตกต่างกันในแง่ของคอมพิวเตอร์และแตกต่างกันในแง่ของเหตุผลทางธุรกิจ ดังนั้นจึงอาจเพียงพอที่จะกล่าวได้ว่ามีความเป็นเอกลักษณ์ที่VoIPProviderถูกกำหนดโดย(Name, URL)สมบูรณ์ ดังนั้นตอนนี้สมมติว่าฉันต้องการวิธีการPUT api/providers/voipเพื่อให้ผู้ใช้ที่มีสิทธิ์สามารถอัพเดตVoIPผู้ให้บริการได้ พวกเขาส่งขึ้นVoIPProviderDTOซึ่งรวมถึงจำนวนมาก แต่ไม่ทั้งหมดของฟิลด์จากVoIPProviderรวมทั้งบางแฟบที่อาจเกิดขึ้น อย่างไรก็ตามฉันไม่สามารถอ่านใจของพวกเขาและพวกเขายังต้องบอกฉันว่าผู้ให้บริการรายใดที่เรากำลังพูดถึง
ดูเหมือนว่าฉันมีตัวเลือก 2 (อาจจะ 3):
- รวมคีย์หลักหรือคีย์สำรองในโมเดลโดเมนของฉันและส่งไปที่ DTO และในทางกลับกัน
- ระบุผู้ให้บริการที่เราใส่ใจผ่านดัชนีที่ไม่ซ้ำใครเช่น
(Name, Url) - แนะนำวัตถุระหว่างกลางบางชนิดที่สามารถแมประหว่างชั้นการคงอยู่โดเมนและ DTO ในแบบที่ไม่เปิดเผยรายละเอียดการใช้งานเกี่ยวกับชั้นการคงอยู่ - พูดโดยแนะนำตัวระบุชั่วคราวในหน่วยความจำเมื่อไปจากโดเมนถึง DTO และย้อนกลับ