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