एक अलग जड़ क्या है?


447

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

रिपॉजिटरी पैटर्न के संदर्भ में, एक समग्र जड़ क्या है?


16
निम्नलिखित मामले के अध्ययन की समीक्षा करने पर विचार करें। प्रभावी समुच्चय डिजाइन भाग I: एक एकल समुच्चय dddcommunity.org/wp-content/uploads/files/pdf_articles/… भाग II: मॉडलिंग करना एक साथ काम करना dddcommunity.org/wp-content/uploads/files/pdf_articles/… भाग III: डिस्कवरी के माध्यम से जानकारी प्राप्त करना dddcommunity.org/wp-content/uploads/files/pdf_articles/…
बेन विटेल

जवाबों:


310

रिपॉजिटरी पैटर्न के संदर्भ में, कुल जड़ें एकमात्र ऑब्जेक्ट हैं जो रिपॉजिटरी से आपके क्लाइंट कोड लोड करते हैं।

रिपॉजिटरी बच्चे की वस्तुओं तक पहुंच को रोकती है - एक कॉलर के दृष्टिकोण से यह स्वचालित रूप से उन्हें लोड करता है, या तो एक ही समय में रूट लोड होता है या जब उन्हें वास्तव में ज़रूरत होती है (जैसा कि आलसी लोडिंग के साथ)।

उदाहरण के लिए, आपके पास एक Orderऑब्जेक्ट हो सकता है जो कई LineItemऑब्जेक्ट्स पर कार्रवाई को एन्क्रिप्ट करता है। आपका क्लाइंट कोड कभी भी LineItemऑब्जेक्ट्स को सीधे लोड नहीं करेगा , बस Orderइसमें उन्हें शामिल किया जाएगा, जो आपके डोमेन के उस हिस्से के लिए कुल रूट होगा।


21
Hypothetically, अगर क्लाइंट कोड को किसी अन्य उद्देश्य के लिए LineItem की आवश्यकता होती है, तो क्या एक अलग समुच्चय बनेगा (यह मानते हुए कि अन्य वस्तुएं ऑर्डर ऑब्जेक्ट से संबंधित नहीं होंगी)?
अहमद

20
@ अहमदाबाद, अन्य समुच्चय लाइन-इट्स को केवल-पढ़ने के लिए डेटा के रूप में संदर्भित कर सकते हैं, वे सिर्फ उन्हें बदल नहीं सकते हैं। यदि अन्य समुच्चय उन्हें बदल सकते हैं, तो आप ऑर्डर के इनवियर्स (न ही लाइन आइटम ') की रक्षा कर सकते हैं।
जेफ सैंट

4
इस पर एक नज़र डालें जैसे कि lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… । उदाहरण में, ग्राहक ऑर्डर का एक आवंटी है, है ना? हालाँकि, ग्राहक एक और समग्र रूट भी हो सकता है? या मुझे यहाँ कुछ मूलभूत समझ याद आ रही है?
अहमद

3
@ जेफ आपने कहा कि "वे उन्हें बदल नहीं सकते हैं" - क्या यह लागू करने योग्य है, या सम्मेलन का मामला है?
नील बर्नवेल 23

4
@ नील: मैं इसे लागू करूँगा जो भी भाषा तंत्र उपलब्ध हैं - उदाहरण के लिए, डेटा का प्रतिनिधित्व करने के लिए एक अपरिवर्तनीय वर्ग बनाकर।
जेफ शाश्वत

206

इवांस डीडीडी से:

एक समुच्चय संबद्ध वस्तुओं का एक समूह है जिसे हम डेटा परिवर्तन के उद्देश्य के लिए एक इकाई के रूप में मानते हैं। प्रत्येक AGGREGATE की एक जड़ और एक सीमा होती है। सीमा निर्धारित करती है कि AGGREGATE के अंदर क्या है। रूट AGGREGATE में निहित एक एकल, विशिष्ट ENTITY है।

तथा:

मूल AGGREGATE का एकमात्र सदस्य है कि बाहर की वस्तुओं को []।

इसका मतलब यह है कि सकल जड़ें एकमात्र ऐसी वस्तुएं हैं जिन्हें भंडार से लोड किया जा सकता है।

एक उदाहरण एक मॉडल है जिसमें एक Customerइकाई और एक Addressइकाई है। हम कभी भी Addressमॉडल से सीधे एक इकाई तक नहीं पहुंचेंगे क्योंकि यह किसी संबद्ध के संदर्भ के बिना समझ में नहीं आता है Customer। इसलिए हम कह सकते हैं कि Customerऔर Addressएक साथ एक समग्र फार्म और कहा कि Customerएक समग्र जड़ है।


57
एरिक इवांस से अपडेट करें : इस बात पर जोर दें कि एग्रीगेट की जड़ें लेन-देन / संगामिति के लिए स्थिरता की सीमाएं हैं और यह मानती हैं कि बाहरी इकाइयां अन्य कुल बाल संस्थाओं के संदर्भ नहीं रख सकती हैं।
ब्रायन लो

3
इसलिए क्रिया हमेशा मुझे भ्रमित कर रही है। Each AGGREGATE has a rootऔर The root is the only *member* of the AGGREGATE- इस क्रिया का तात्पर्य है कि जड़ एग्रीगेट पर संपत्ति है। लेकिन सभी उदाहरणों में, यह दूसरा तरीका है: रूट में ऐसे गुण हैं जो समुच्चय हैं। क्या आप स्पष्ट कर सकते हो?
सिनास्टैटिक

1
बस अपनी भाषा सही करने के लिए, क्या Customerकक्षा को मूल जड़, या Customer उदाहरण माना जाता है ?
जो

1
आम तौर पर ग्राहक-ऑर्डर-लाइन-आइटम प्रतिमान में बोलते हुए ग्राहक एग्रिगेट रूट होगा। एक ग्राहक का उदाहरण उस एग्रीगेट रूट का एक उदाहरण होगा। ग्राहक कहे जाने वाले एग्रीगेट रूट की बात करते समय आप उस ग्राहक के तार्किक निर्माण पर चर्चा कर रहे हैं जो ग्राहक का उदाहरण प्रस्तुत करता है। ग्राहकों का एक संग्रह सिर्फ एक संग्रह है।
इब्राहिम मल्लुफ़

111

एग्रीगेट रूट सरल विचार का एक जटिल नाम है।


सामान्य विचार

अच्छी तरह से डिज़ाइन किया गया वर्ग आरेख इसके आंतरिक भाग को घेरता है। वह बिंदु जिसके माध्यम से आप इस संरचना को एक्सेस करते हैं, कहा जाता है aggregate root

यहां छवि विवरण दर्ज करें

आपके समाधान के आंतरिक भाग बहुत जटिल हो सकते हैं, लेकिन इस पदानुक्रम का उपयोगकर्ता बस उपयोग करेगा root.doSomethingWhichHasBusinessMeaning()


उदाहरण

इस सरल वर्ग पदानुक्रम की जाँच करें यहां छवि विवरण दर्ज करें

आप अपनी कार की सवारी कैसे करना चाहते हैं? बेहतर आपी को चुना

विकल्प A (यह किसी तरह काम करता है):

car.ride();

विकल्प बी (उपयोगकर्ता को कक्षा में प्रवेश की सुविधा है):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

अगर आपको लगता है कि विकल्प ए बेहतर है तो बधाई। आपको मुख्य कारण मिलता है aggregate root


अलग-अलग रूट कई वर्गों को अतिक्रमण करता है। आप केवल मुख्य वस्तु के माध्यम से पूरे पदानुक्रम में हेरफेर कर सकते हैं।


17
मुझे उदाहरण पसंद है, लेकिन मैं एक परिदृश्य खोजने के लिए संघर्ष कर रहा हूं जिसमें ग्राहक को इंजन का संदर्भ देना चाहिए। ऐसा लगता है जैसे कार के पीछे इंजन को इनकैप्सुलेट किया जाना चाहिए। क्या आप इस पर थोड़ा विस्तार कर सकते हैं?
एमरजिन्स

मेरी राय में इंजन में कार विशिष्ट मॉडल होना चाहिए, जैसे 3000cc इंजन के साथ बीएमडब्ल्यू श्रृंखला 5। इस मॉडलिंग के साथ इंजन एक कार के लिए एक घटक है।
परम धर्मिका

1
@ParamaDharmika यकीन है, आप इसे इस तरह से मॉडल कर सकते हैं। यह इस बात पर निर्भर करता है कि कारों के साथ 'उन्नत' आपके ग्राहक कैसे हैं। मूल मॉडल में उसे carकुल मूल तक पहुंच होनी चाहिए । आप ड्राइंग पर एक जैसी स्थिति की अनुमति भी दे सकते हैं। सही समाधान आवेदन के व्यापार मॉडल पर निर्भर करता है। यह प्रत्येक मामले में भिन्न हो सकता है।
मार्सिन Szymczak

1
@MarcinSzymczak सही है, और अधिक समाधान ही डोमेन मॉडल पर निर्भर है कि इस बात से सहमत नहीं हो सकता था
Parama Dharmika

दरअसल, व्हील एक एग्रीगेट है जिसमें टायर (और अन्य भाग) होते हैं। यदि आपके नियमों की आवश्यकता है कि व्हील एग्रीगेट केवल कार रूट-एग्रीगेट के माध्यम से पहुँचा जा सकता है, तो इंजन कार रूट एग्रीगेट के भीतर भी समाहित है और इसे कार के बाहर एक्सेस नहीं किया जाना चाहिए। यह एक कार उदाहरण के दायरे में है। एक कार मालिक (ग्राहक) अपनी कार के संदर्भ में एक इंजन को संदर्भित नहीं करेगा।
इब्राहिम मल्लुफ़

35

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

एग्रीगेट रूट, एग्रीगेट (हमारे मामले में) के अंदर मातृत्व इकाई है Computer ) , यह एक आम बात है कि आपकी रिपॉजिटरी केवल उन्हीं संस्थाओं के साथ काम करती है जो एग्रीगेट रूट हैं और यह एंटिटी अन्य एंटिटीज को इनिशियलाइज़ करने के लिए जिम्मेदार है।

एग्रीगेट को एक एंट्री-पॉइंट के रूप में एग्रीगेट रूट मानें।

C # कोड में:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

ध्यान रखें कि हार्डवेयर संभवतः एक ValueObject भी होगा (इसकी स्वयं की पहचान नहीं है), इसे केवल एक उदाहरण के रूप में मानें।


6
where T : IAggregateRoot- इसने मेरा दिन बनाया
क्रिस्चियन ई।

शब्द थोड़ा विरोधाभासी है, मुझे लगता है और यही मुझे सीखने की कोशिश करते समय भ्रमित करता है। आप कह रहे हैं कि कंप्यूटर समुच्चय है, लेकिन फिर आप कह रहे हैं कि मूल इकाई के अंदर मातृशक्ति इकाई होगी। तो इस उदाहरण में कुल मिलाकर "मदरशिप" इकाई कौन सी है?
सिनास्टेटिक

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

IAggregateRoot तकनीक Microsoft के दस्तावेज़ में दिखाई देती है: docs.microsoft.com/en-us/dotnet/altecture/microservices/…
सैमुअल डेनियलसन

16

यदि आप एक डेटाबेस-प्रथम दृष्टिकोण का पालन करते हैं, तो आप मूल रूप से 1-कई संबंधों के 1 पक्ष पर तालिका है।

एक व्यक्ति होने के नाते सबसे आम उदाहरण है। प्रत्येक व्यक्ति के कई पते, एक या अधिक वेतन पर्ची, चालान, सीआरएम प्रविष्टियाँ आदि हैं। यह हमेशा ऐसा नहीं होता है, लेकिन 9/10 बार होता है।

वर्तमान में हम एक ई-कॉमर्स प्लेटफॉर्म पर काम कर रहे हैं, और हमारे पास मूल रूप से दो समुच्चय हैं:

  1. ग्राहकों
  2. सेलर्स

ग्राहक संपर्क जानकारी की आपूर्ति करते हैं, हम उन्हें लेनदेन प्रदान करते हैं, लेन-देन लाइन आइटम प्राप्त करते हैं, आदि।

विक्रेता उत्पादों को बेचते हैं, लोगों से संपर्क करते हैं, हमारे बारे में पृष्ठ, विशेष प्रस्ताव आदि।

क्रमशः ग्राहक और विक्रेता भंडार द्वारा इनका ध्यान रखा जाता है।


8
यदि आप एक डेटाबेस-प्रथम दृष्टिकोण का पालन करते हैं तो आप डोमेन ड्रिवेन डिज़ाइन का अभ्यास नहीं कर रहे हैं, आप डेटा ड्रिवेन डिज़ाइन का अनुसरण कर रहे हैं।
सिनास्टेटिक 18

5
यह एक प्रश्नोत्तर मंच है जहां लोग समस्याओं को हल करने और / या सीखने के लिए आते हैं - यह मुझे आप पर नहीं झकझोर रहा था। परिभाषा के अनुसार, DDD किसी भी चीज़ से अधिक एक मानसिकता है और यह कई लोगों के लिए भ्रमित करने वाला है, इसलिए यह मुझे सुनिश्चित कर रहा था कि उन लोगों के लिए टिप्पणी की गई थी जो डिज़ाइन के तरीकों के किसी भी संभावित टकराव को कम करने में मदद करने के लिए DDD सीख रहे हैं।
सिनास्टेटिक

12

दीना:

एक रिपॉजिटरी के संदर्भ में द एग्रिगेट रूट एक ऐसी संस्था है जिसमें कोई अभिभावक नहीं होता है। इसमें शून्य, एक या कई बाल संस्थाएं शामिल हैं जिनका अस्तित्व इसकी पहचान के लिए जनक पर निर्भर है। यह एक रिपोजिटरी में कई रिश्तों के लिए एक है। वे चाइल्ड एंटिटीज प्लेन एग्रीगेट्स हैं।

यहां छवि विवरण दर्ज करें


1
तो, अगर आप एक कार विक्रेता हैं, तो कार अपने आप में एक समग्र जड़ होगी? क्योंकि आपके पास ऐसी कई कारें हो सकती हैं, जिनके ग्राहक अभी तक नहीं हैं
JorgeeFG

2
@ जोर्जफ जीजी का असली जवाब है किसी को किसी तरह का कोई सुराग नहीं है। चारों ओर बहुत कुछ परस्पर विरोधी जानकारी है।
मर्डॉक्सक्स

3
बाल संस्थाएँ समुच्चय नहीं हैं, वे केवल ऐसी संस्थाएँ हैं जो समुच्चय के सदस्य होते हैं जिसमें कुल मूल नियंत्रण होता है। एक "कुल" संस्थाओं का एक तार्किक समूह है।
सिनास्टिक

@ जोर्जफ यह वास्तव में आपके द्वारा डिज़ाइन किए गए बंधे हुए संदर्भ पर निर्भर करता है। यदि आप एक कार विक्रेता हैं, तो कारशोप जैसी कोई चीज़ कुल मिलाकर जड़ बन जाती है, और इसके नीचे कारें
चलती हैं

8

एक टूटी हुई कड़ी से :

एक एग्रीगेट के भीतर एक एग्रीगेट रूट होता है। एग्रीगेट रूट अन्य सभी एंटिटीज और वैल्यू ऑब्जेक्ट्स के लिए पैरेंट एंटिटी है।

एक रिपोजिटरी एक सकल रूट पर काम करती है।

अधिक जानकारी भी यहाँ मिल सकती है


4
धन्यवाद। यह निश्चित रूप से सबसे आम और निराशाजनक टूटी हुई कड़ी है जो मैंने लगातार पार की थी।
दिनाँक

इसके अलावा, शब्द पीछे की ओर लगता है। जड़ के भीतर कैसे हो सकता है और यह एक ही समय में माता-पिता हो सकता है?
सिनास्टैटिक

1
एग्रीगेट रूट रूट क्लास है। एक सादा एग्रीगेट हमेशा एक एग्रीगेट रूट के भीतर निहित होता है। ऊपर दिए गए आरेख का उपयोग करना ... ग्राहक एग्रीगेट-रूट है। ग्राहक एक या अधिक कार का मालिक हो सकता है। ग्राहक के संबंध में कारें एग्रीगेट हैं। कारों में एक इंजन होता है। इंजन एक एग्रीगेट है जो कार एग्रीगेट में निहित है। ग्राहक को एक एग्रीगेट रूट बनाता है यह मॉडल की धारणा है कि कार तक पहुंच है या यह घटक हमेशा ग्राहक के माध्यम से होते हैं जो कार का मालिक होता है।
इब्राहिम मल्लूफ़

8

एग्रीगेट का अर्थ है किसी चीज का संग्रह।
जड़ पेड़ के शीर्ष नोड की तरह है, जहां से हम <html>वेब पेज दस्तावेज़ में नोड की तरह सब कुछ एक्सेस कर सकते हैं ।
ब्लॉग सादृश्य, एक उपयोगकर्ता में कई पोस्ट हो सकते हैं और प्रत्येक पोस्ट में कई टिप्पणियां हो सकती हैं। इसलिए यदि हम किसी भी उपयोगकर्ता को लाते हैं तो यह सभी संबंधित पोस्ट और उन पोस्ट की आगे की टिप्पणियों तक पहुंचने के लिए मूल के रूप में कार्य कर सकता है । इन सभी को एक साथ संग्रह या एकत्र होना कहा जाता है


1

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


-1

Erlang में समुच्चय के बीच अंतर करने की आवश्यकता नहीं होती है, एक बार जब OO संरचना के बजाय राज्य के अंदर डेटा संरचनाओं द्वारा समुच्चय की रचना की जाती है। एक उदाहरण देखें: https://github.com/bryanhunter/cqrs-with-erlang/tree/nd-london

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.