DDD: ถูกต้องหรือไม่สำหรับการรวมรูทเพื่อระงับการอ้างอิงถึงการรวมรูทอื่น?


16

เมื่อติดตามการออกแบบที่ขับเคลื่อนด้วยโดเมน (DDD) จะถูกต้องหรือไม่สำหรับการรวมของรูทเพื่อเก็บการอ้างอิงไปยังเอนทิตีภายในที่เกิดขึ้นเป็นเอนทิตีรูทของการรวมแยกต่างหาก

ฉันเชื่อว่านี่ไม่ถูกต้องส่วนใหญ่เป็นเพราะกฎนี้ในหนังสือสีฟ้า :

ไม่มีสิ่งใดนอกขอบเขต AGGREGATE ที่สามารถเก็บการอ้างอิงถึงสิ่งใด ๆ ภายในยกเว้นราก ENTITY ENTITY รูทสามารถส่งการอ้างอิงไปยัง ENTITIES ภายในกับวัตถุอื่น ๆ ได้ แต่วัตถุเหล่านั้นสามารถใช้งานได้ชั่วคราวเท่านั้นและอาจไม่สามารถใช้อ้างอิงได้ รูทอาจส่งมอบค่าของวัตถุประสงค์ให้แก่วัตถุอื่นและไม่สำคัญว่าจะเกิดอะไรขึ้นกับมันเนื่องจากเป็นเพียงค่าและจะไม่มีการเชื่อมโยงกับ AGGREGATE อีกต่อไป

หากการรวมรากถือการอ้างอิงไปยังการรวมรากอื่นขอบเขตของอดีตถูกละเมิดและแนวคิดทั้งหมดของการรวมเสียหายดังนั้นฉันเชื่อว่าถ้าการรวมรากดูเหมือนว่าจำเป็นต้องระงับการอ้างอิงถึงการรวมรากอื่นแล้วฉันต้อง เพื่อสร้างเอนทิตีที่แตกต่างกันซึ่งอาจจะแบ่งสมาชิกบางส่วนเหมือนกับเอนทิตีรูทอื่น แต่จะไม่มีข้อมูลประจำตัวทั่วโลกเช่นกฎอื่น ๆ ในรัฐหนังสือ:

รูต ENTITIES มีตัวตนระดับโลก ENTITIES ภายในขอบเขตมีเอกลักษณ์เฉพาะที่ไม่ซ้ำกันภายใน AGGREGATE

ฉันเชื่อว่านี่จะเป็นวิธีที่ถูกต้อง แต่เนื่องจากมันให้ความรู้สึกซ้ำซากและซ้ำซ้อน (เมื่อนำออกจากบริบทของ DDD ด้วย OOP บริสุทธิ์) ฉันกำลังขอคำติชม


คุณหมายถึงอะไรโดย "เอนทิตีภายใน (ที่เกิดขึ้นเป็นเอนทิตีรูทของการรวมแบบแยกต่างหาก)"?
Erik Eidt

2
FWIW สิ่งใดที่อาจอ้างถึงเอนทิตีรูทรวมเนื่องจากสิ่งเหล่านี้เป็นสิ่งที่มีเอกลักษณ์ระดับโลก ไม่ว่าผู้อ้างอิงนั้นจะเป็นตัวตนของรูทหรือไม่ก็ตาม
Erik Eidt

อย่างที่ Erik พูด นอกจากนี้มันไม่สำคัญว่าคุณจะอ้างอิงโดยใช้ ID หรือการอ้างอิงในรุ่นของคุณ ทั้งสองจะแปลงเป็น ID ในระดับ DB และมีการอ้างอิงให้ความสามารถในการ ORM ที่จะโหลดเอนทิตีตามความต้องการ
ร่าเริง

คำตอบ:


21

คุณอาจตีความหนังสือมากเกินไป โดยพื้นฐานแล้วมันพูดว่า: สิ่งใดก็ตามที่อยู่นอกกลุ่มรวมไม่สามารถมีการอ้างอิงถึงสิ่งใด ๆ ที่อยู่ภายในมันยกเว้นราก ดังนั้นการถือการอ้างอิงรูทจึงเป็นสิ่งที่ถูกต้อง การถือการอ้างอิงไปที่รูทไม่ได้หมายความว่ามันเป็นส่วนหนึ่งของการรวมตัวของคุณเองและคุณสามารถควบคุมค่าคงที่ได้ มันทำให้ค่าคงที่และอิสระของตัวเอง

อย่างไรก็ตาม

  • แนวปฏิบัติที่ดีที่ได้รับการยอมรับโดยทั่วไปคือการอ้างถึง AR โดยการจัดเก็บ ID ไม่ใช่การอ้างอิงแบบเต็ม
  • วิธีการที่ทันสมัยกว่าในการรวมการออกแบบ (ดูRed Book ) สนับสนุนการแยกที่ชัดเจนระหว่าง Aggregates ธุรกรรมทางธุรกิจควรเปลี่ยนสถานะของการรวมเดียว ภายใต้สมมติฐานนี้ความจำเป็นในการจัดเก็บการอ้างอิงถึงการรวมอื่นมีแนวโน้มที่จะหายไปเนื่องจากคุณจะไม่แก้ไขการรวม 2 ครั้งในเวลาเดียวกัน

ถูกต้องหรือไม่ที่การรวมรูทจะถือการอ้างอิงไปยังเอนทิตีภายในที่เกิดขึ้นเป็นเอนทิตีรูทของการรวมแยกต่างหาก

สิ่งนี้ไม่เคยเกิดขึ้น Value Object สามารถเป็นส่วนหนึ่งของหลาย Aggregates แต่ไม่ใช่ Entity เหตุผลคือไม่มีอะไรที่จะป้องกันไม่ให้คุณแบ่งปันอินสแตนซ์เอนทิตี้เดียวกันระหว่างมวลรวม สมมติว่าเอนทิตีอินสแตนซ์ E เป็นทั้งอินสแตนซ์รวม A และ B เนื่องจากข้อสรุปของ DDD คือ Aggregate เป็นจุดเริ่มต้นคุณจะสามารถโหลด A แก้ไขเอนทิตี้ E ผ่านได้ในขณะที่ละเมิดค่าคงที่จาก B (ที่คุณไม่ได้โหลด)

ดูคำตอบจาก Greg Young ได้ที่นี่: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html


ขอบคุณ Guillaume สำหรับคำตอบที่ชัดเจนกระชับและลึกซึ้ง True DDD นักเลงเป็นนักปราชญ์ นี่คือสิ่งที่ฉันกำลังมองหา Chapeau!
Lesair Valmont

ฉันรู้ว่ามันอาจเป็นคำถามที่โง่ แต่ฉันจะถามความหมายของholding a referenceสิ่งนี้ได้อย่างไรในบริบทนี้ เพราะฉันสับสนเมื่อคุณพูดว่า: holding a reference to a root is legitหลังจากนั้นคุณพูดว่า:This never happens. A Value Object can be part of multiple Aggregates, but not an Entity. The reason is, nothing would then prevent you from sharing the same entity instance between Aggregates.
Anyname Donotcare

1
ถือการอ้างอิง = เก็บไว้ภายใน / คงทนในฐานะสมาชิกของชั้นเรียน การแบ่งขั้วตรงนี้เป็นรูตเทียบกับไม่รูท คุณสามารถระงับการอ้างอิงรูท แต่ไม่ใช่การอ้างอิงรูท
guillaume31

@ guillaume31 ขอบคุณมาก แต่ฉันขอถามได้ไหมว่ามันเป็นเรื่องidของหน่วยงานภายใน (ไม่ใช่รูท) ในการรวมกลุ่มอื่นหรือไม่และนี่เป็นการละเมิดหรือไม่ (รูทหรือไม่)
Anyname Donotcare

คุณจะทำอะไรกับ ID นั้น แม้แต่ที่เก็บเท่านั้นให้รากคุณไม่ใช่หน่วยงานภายใน
guillaume31

1

วัตถุรากรวมของคุณควร (โดยทั่วไป) มีคุณสมบัติที่เป็นส่วนหนึ่งของโดเมน

หากคุณมีออบเจ็กต์ AR ที่มีคุณสมบัติซึ่งไม่ได้อยู่ในการรวมคุณจะต้องพบกับคำถามในทันที 'ทำไมจะไม่ล่ะ?'

คุณสามารถเพิ่มรหัสของวัตถุอื่น ๆ ได้ไหม? หรือฉีดที่เก็บ?

แต่ดูเหมือนว่าคุณควรเพิ่มบริการข้ามโดเมนซึ่งอ้างอิงทั้งวัตถุหลักและดำเนินการตามตรรกะที่ต้องการ


Ewan ฉันคิดว่าการนำคลาสมาใช้ใหม่ระหว่างการรวมสองแบบที่แตกต่างกันในแง่ของ OOP แทนที่จะให้บริการโดเมนทำหน้าที่เป็นสคริปต์ธุรกิจที่จะทำงานบางอย่างกับการรวม DDD สองแบบที่แตกต่างกัน โดยสรุปฉันเห็นด้วยกับคุณรากรวมของฉันควรมีคุณสมบัติที่เป็นส่วนหนึ่งของโดเมน
Lesair Valmont
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.