DDD: क्या रूट एग्रीगेट के लिए किसी अन्य रूट एग्रीगेट के संदर्भ को रखना सही है?


17

डोमेन-संचालित डिज़ाइन (DDD) का अनुसरण करते समय, रूट एग्रीगेट के लिए आंतरिक इकाई के संदर्भ को रखने के लिए सही है जो एक अलग एग्रीगेट पर रूट एंटिटी होता है?

मेरा मानना ​​है कि यह सही नहीं है, मुख्यतः नीली किताब पर इस नियम के कारण :

AGGREGATE सीमा के बाहर कुछ भी जड़ ENTITY को छोड़कर, अंदर की किसी भी चीज़ का संदर्भ नहीं रख सकता है। रूट ENTITY, आंतरिक ENTITIES को अन्य वस्तुओं के लिए संदर्भ सौंप सकती है, लेकिन वे ऑब्जेक्ट केवल क्षणिक रूप से उनका उपयोग कर सकते हैं, और वे संदर्भ को पकड़ नहीं सकते हैं। रूट किसी अन्य ऑब्जेक्ट के लिए VALUE OBJECT की एक प्रति सौंप सकता है, और इससे कोई फर्क नहीं पड़ता कि उसके साथ क्या होता है, क्योंकि यह सिर्फ VALUE है और अब AGGREGATE के साथ कोई संबंध नहीं होगा।

यदि कोई रूट एग्रीगेट किसी अन्य रूट एग्रीगेट का संदर्भ रखता है, तो पूर्व की सीमा का उल्लंघन होता है और एक एग्रीगेट की पूरी अवधारणा दूषित हो जाती है, इसलिए मेरा मानना ​​है कि यदि रूट एग्रीगेट किसी अन्य रूट एग्रीगेट के संदर्भ को रखने की आवश्यकता महसूस करता है, तो मुझे इसकी आवश्यकता है एक अलग इकाई बनाने के लिए , जो कि शायद अन्य रूट इकाई के समान सदस्यों में से कुछ को साझा करेगी, लेकिन वैश्विक पहचान नहीं होगी, जैसा कि पुस्तक के राज्यों में यह अन्य नियम है:

रूट ENTITIES की वैश्विक पहचान है। सीमा के अंदर स्थित एजेंसियों की स्थानीय पहचान है, जो केवल AGGREGATE के भीतर अद्वितीय है।

मेरा मानना ​​है कि यह जाने का सही तरीका होगा, लेकिन जब से यह दोहराव और निरर्थक लगता है (जब डीडीडी के संदर्भ में, शुद्ध ओओपी के साथ लिया गया है) मैं कुछ प्रतिक्रिया मांग रहा हूं।


"आंतरिक इकाई (जो एक अलग समुच्चय पर मूल इकाई होती है)" से आपका क्या तात्पर्य है?
एरिक Eidt

2
एफडब्ल्यूआईडब्ल्यू, कुछ भी एक समग्र रूट इकाई को संदर्भित कर सकते हैं क्योंकि ये वैश्विक पहचान वाली चीजें हैं; क्या रेफरल अपने आप में एक जड़ इकाई है या नहीं, सारहीन है।
एरिक Eidt

जैसा कि एरिक ने कहा। इसके अलावा, यह कोई फर्क नहीं पड़ता कि आप इसे अपने मॉडल में आईडी या संदर्भ का उपयोग करके संदर्भित करते हैं। यह दोनों डीबी स्तर पर आईडी में परिवर्तित हो जाएगा और एक संदर्भ होने पर ओआरएम को मांग पर इकाई को आलसी लोड करने की क्षमता देता है।
यूफोरिक

जवाबों:


21

आप पुस्तक को देख सकते हैं। यह मूल रूप से कहता है: एक एग्रीगेट के बाहर की कुछ भी जड़ के अलावा उसके अंदर की किसी भी चीज का संदर्भ नहीं रखा जा सकता है। इसलिए, किसी रूट का संदर्भ रखना वैध है। एक रूट के संदर्भ को रखने का मतलब यह नहीं है कि यह आपके स्वयं के कुल का हिस्सा है और आप इसके आक्रमणकारियों को नियंत्रित कर सकते हैं। यह अपने स्वयं के आक्रमणकारियों और स्वायत्तता रखता है।

तथापि,

  • एक आम तौर पर स्वीकृत अच्छा अभ्यास एक एआर को संदर्भित करने के लिए अपनी आईडी को संग्रहीत करके है, पूर्ण संदर्भ नहीं।
  • एग्रीगेट के बीच एक क्लीनर जुदाई की वकालत करने के लिए अधिक आधुनिक दृष्टिकोण ( रेड बुक देखें )। एक व्यापारिक लेनदेन को केवल एक एकल समूह की स्थिति को बदलना चाहिए। इस धारणा के तहत, किसी अन्य एग्रीगेट के संदर्भ को संग्रहीत करने की आवश्यकता गायब हो जाती है क्योंकि आप एक ही समय में 2 समुच्चय संशोधित नहीं करने जा रहे हैं।

क्या रूट एग्रीगेट के लिए एक आंतरिक इकाई का संदर्भ रखना सही है, जो एक अलग एग्रीगेट पर रूट एंटिटी होता है?

ऐसा कभी नहीं होता। एक वैल्यू ऑब्जेक्ट कई एग्रीगेट्स का हिस्सा हो सकता है, लेकिन एक इकाई नहीं। इसका कारण यह है कि कुछ भी तब आपको एग्रीगेट्स के बीच एक ही इकाई उदाहरण साझा करने से नहीं रोकेगा । मान लें कि इकाई उदाहरण E, दोनों ए और बी दोनों से संबंधित है क्योंकि DDD का आधार यह है कि एग्रीगेट प्रवेश बिंदु है, तो आप A को लोड कर पाएंगे, इकाई E को इसके माध्यम से संशोधित कर पाएंगे, जबकि सभी चुपचाप हमलावरों का उल्लंघन कर सकते हैं। B (जो आपने लोड नहीं किया था)।

यहां से ग्रेग यंग का जवाब देखें: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Seden-across-many-Aggregates-tdx7979277.html


स्पष्ट, संक्षिप्त और आनंददायक उत्तर के लिए धन्यवाद गिलोय। यह सच है डीडीडी पारखी के साथी-साथी। यह वही है जिसे मैं देख रहा था। Chapeau!
लेज़ेयर वैल्मोंट

मुझे पता है कि यह एक मूर्खतापूर्ण प्रश्न हो सकता है, लेकिन क्या मैं पूछ सकता हूं कि 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आंतरिक इकाई (नहीं-रूट) को किसी अन्य कुल में रखना ठीक है या यह उल्लंघन करता है कि क्या (रूट या नहीं)?
19:08 पर डोनटकेयर

आप उस आईडी का क्या करेंगे? यहां तक ​​कि रिपॉजिटरी केवल आपको जड़ें देती हैं, आंतरिक संस्थाएं नहीं।
गुइलोमेय

1

आपके कुल रूट ऑब्जेक्ट में (आम तौर पर) केवल गुण होते हैं जो इसके डोमेन का हिस्सा होते हैं।

यदि आपके पास एक संपत्ति के साथ एक एआर ऑब्जेक्ट है जो कुल में नहीं है तो आपको तुरंत प्रश्न का सामना करना पड़ता है। 'क्यों नहीं?'

आप शायद अन्य ऑब्जेक्ट की आईडी जोड़ सकते हैं? या एक भंडार इंजेक्ट करें?

लेकिन ऐसा लगता है कि आपको एक क्रॉस डोमेन सेवा को जोड़ना चाहिए जो दोनों रूट ऑब्जेक्ट को संदर्भित करता है और आवश्यक तर्क करता है


इवान, मैं ओओपी के अर्थ में दो अलग-अलग एकत्रीकरण के बीच एक वर्ग का पुन: उपयोग करने के बारे में अधिक सोच रहा था, बल्कि एक डोमेन सेवा को एक व्यापार स्क्रिप्ट के रूप में कार्य कर रहा था जो दो अलग-अलग डीडीडी समुच्चय के साथ कुछ काम कर रहा होगा। अंत में मैं आपके साथ सहमत हूं, मेरी कुल जड़ में केवल वे गुण होने चाहिए जो इसके डोमेन का हिस्सा हैं।
लेस्सर वैल्मोंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.