डोमेन संचालित डिज़ाइन और क्रॉस डोमेन इंटरैक्शन


10

मैं एक रिश्तेदार डीडीडी नौसिखिया हूं, लेकिन मैं कुछ भी पढ़ रहा हूं और मेरे ज्ञान को उबालने और खराब करने के लिए मैं अपने हाथों को प्राप्त कर सकता हूं।

मैं इस डीडीडी सवाल पर आया था, और जवाबों में से एक ने मुझे परेशान किया है।

DDD बंधे हुए संदर्भ और डोमेन?

एक उत्तर में पोस्टर कम से कम 2 डोमेन में उत्पादों के साथ एक ई-कॉमर्स प्रणाली का उदाहरण देता है:

1) उत्पाद सूची 2) इन्वेंटरी प्रबंधन

ठीक है, यह सब समझ में आता है, यानी आपके ईकॉमर्स फ्रंट एंड में आप उत्पाद जानकारी प्रदर्शित करने में रुचि रखते हैं, और इन्वेंट्री प्रबंधन में कोई दिलचस्पी नहीं है।

परंतु। आप वेब पेज पर इन्वेंट्री स्तर प्रदर्शित करना चाह सकते हैं, या आप स्टॉक में इन्वेंट्री के संस्करण संख्या को प्रदर्शित करना चाह सकते हैं (कल्पना करें कि आपकी इन्वेंट्री किताबें, पत्रिकाएं आदि हैं)। यह जानकारी इन्वेंटरी डोमेन से आती है।

तो, आप इसे कैसे संभालेंगे? क्या तुम

a) उत्पाद डोमेन और इन्वेंटरी डोमेन समुच्चय दोनों को लोड करें? ख) क्या आप स्टॉक में संख्या और स्टॉक में संस्करण के लिए अपने उत्पाद डोमेन इकाई पर कुछ संपत्तियाँ रखेंगे, और फिर इन्वेंटरी इकाई को अपडेट करने के लिए इन्हें अपडेट करने के लिए डोमेन ईवेंट का उपयोग करेंगे?

एक अंतिम प्रश्न। मुझे पता है कि हम डोमेन की दृढ़ता को भूल / अनदेखा करने के लिए हैं और सिर्फ डोमेन के बारे में सोचते हैं। लेकिन सिर्फ यह सोचने के लिए, ऊपर के उदाहरण में हम उत्पाद सूची और उत्पाद सूची के लिए संभावित 2 DB तालिकाओं के साथ समाप्त हो जाएंगे। अब, क्या हम इनमें समान पहचानकर्ता का उपयोग करते हैं क्योंकि यह समान उत्पाद है। या, क्या हम डेटा के लिए 1 टेबल और 1 टेबल पंक्ति का उपयोग कर सकते हैं और बस एग्रीगेट गुणों पर संबंधित डेटा को मैप कर सकते हैं?

जवाबों:


8

आप वेब पेज पर इन्वेंट्री स्तर प्रदर्शित करना चाह सकते हैं, या आप स्टॉक में इन्वेंट्री के संस्करण संख्या को प्रदर्शित करना चाह सकते हैं (कल्पना करें कि आपकी इन्वेंट्री किताबें, पत्रिकाएं आदि हैं)। यह जानकारी इन्वेंटरी डोमेन से आती है।

इस बिंदु पर ध्यान देने वाली मुख्य बात यह है कि आप एक दृश्य के बारे में बात कर रहे हैं, जो यह कहना है कि बासी डेटा का उपयोग करना स्वीकार्य है।

यह कहा जा रहा है, आपको समुच्चय के साथ बातचीत करने की आवश्यकता नहीं है (जो कि व्यवसाय के उल्लंघनकर्ता के परिवर्तनों को रोकने के लिए ज़िम्मेदार हैं), लेकिन कुल राज्य की हालिया प्रति के प्रतिनिधित्व के साथ।

तो मैं सामान्य रूप से क्या उम्मीद करूंगा कि उत्पाद सूची के खिलाफ एक क्वेरी रन, और इन्वेंटरी के खिलाफ एक और रन, और डीटीओ में दो की रचना करने के लिए कुछ ऐसा है जिसे आपको देखने का समर्थन करने की आवश्यकता है।

उत्पाद डोमेन और इन्वेंटरी डोमेन एग्रीगेट्स दोनों को लोड करें?

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

क्या आप स्टॉक में संख्या और स्टॉक में संस्करण के लिए अपने उत्पाद डोमेन इकाई पर कुछ संपत्तियाँ रखेंगे, और फिर इन्वेंटरी इकाई को अपडेट करने के लिए डोमेन इवेंट का उपयोग करेंगे?

"धाराओं को पार मत करो। यह बुरा होगा।"

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

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

मुझे किसी भी कारण का पता नहीं है कि एक एकल आवेदन को एक डोमेन के लिए प्रतिबंधित किया जाना चाहिए। जब तक सच्चाई का एक ही स्रोत है, तब तक आप किसी भी तरह से लेनदेन को वितरित कर सकते हैं।

लेकिन सिर्फ यह सोचने के लिए, ऊपर के उदाहरण में हम उत्पाद सूची और उत्पाद सूची के लिए संभावित 2 DB तालिकाओं के साथ समाप्त हो जाएंगे। अब, क्या हम इनमें समान पहचानकर्ता का उपयोग करते हैं क्योंकि यह समान उत्पाद है।

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

जब वह काम नहीं करता है, तो अंतर को पाटने के लिए आपको कुछ क्वेरी की आवश्यकता होगी। मुझे लगता है कि इसकी सबसे आम भिन्नता यह है कि नई इकाई पुरानी इकाई की आईडी को संरक्षित करती है। आप इसे एकल बीसी के भीतर भी देखेंगे: आवेदक, अनुमोदित होने पर, ग्राहक बन जाते हैं। यह एक अलग समुच्चय है (एक ग्राहक के साथ जुड़ा राज्य आवेदक की तुलना में एक अलग आवेग के अधीन है); इसलिए यदि आपकी दृढ़ता घटना धाराओं का उपयोग कर रही है, तो नए समुच्चय के लिए स्ट्रीम को एक अलग पहचानकर्ता की आवश्यकता होगी। तो कहीं न कहीं एक अवस्था होगी जो कहती है "यह आवेदक इस ग्राहक बन गया"।

या, क्या हम डेटा के लिए 1 टेबल और 1 टेबल पंक्ति का उपयोग कर सकते हैं और बस एग्रीगेट गुणों पर संबंधित डेटा को मैप कर सकते हैं?

ओह! नहीं, ऐसा मत करो। आप ऐसा करने के लिए किसी भी व्यावसायिक कारण के बिना लेनदेन विवाद को जोड़ रहे हैं।


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

मैं अभी इस लेख को पढ़ता हूँ msdn.microsoft.com/en-us/magazine/dn802601.aspx जो संदर्भों के बीच कुछ डेटा को डुप्लिकेट करने के लिए डोमेन ईवेंट का उपयोग करके विवरण देता है। ग्राहक सेवा और ऑर्डर प्रोसेसिंग सिस्टम के बीच ग्राहक सूची साझा करने वाला उदाहरण। यह ऑर्डर सिस्टम में ग्राहक डेटा को डुप्लिकेट कर रहा है, और डेटा को सिंक करने के लिए इवेंट्स का उपयोग कर रहा है। हम यहां जो जवाब दे चुके हैं उसके सामने यह उड़ जाता है। निश्चित रूप से लिंक किए गए नमूने में ऑर्डर संदर्भ को केवल एक customerID की आवश्यकता होती है, और इसे उस एप्लिकेशन से पॉपुलेट किया जा सकता है जिसकी ग्राहक सेवा संदर्भ तक पहुंच है।
पेंडोरपॉल

आप अपनी सोच में, यहाँ बहुत सटीक होना चाहते हैं। सिस्टम के बीच डेटा की प्रतिलिपि बनाना डोमेन मॉडल के बीच डेटा की प्रतिलिपि बनाने के समान नहीं है। जितनी बार भी आप "केवल पढ़ने के लिए देखें"
VoiceOfUnreason 21

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

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

3

मुझे लगता है कि आपका प्रश्न वास्तव में विकल्पों के 2 ऑर्थोगोनल सेट के लिए कहता है -

  • क्या आप दो वस्तुओं को लोड करते हैं और उनके डेटा को एक साथ प्रस्तुत करते हैं या क्या आप 1 वस्तु को लोड करते हैं जिसमें वह सब कुछ है जो आप चाहते हैं?

  • क्या आप सामान प्रदर्शित करने के लिए समुच्चय का उपयोग करते हैं, या कुछ और?

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

आपके क्यू से समाधान ए) इन नुकसानों में से बहुत से लगता है। विकल्प b) मान्य हो सकता है, लेकिन मैं इसका उपयोग केवल तभी करूँगा InventoryManagementजब Productसमुच्चय को परिवर्तित करते समय अपरिवर्तनीयों को लागू करने के लिए BC के डेटा की आवश्यकता होगी । यह बेहतर है अगर एक समग्र में संशोधन पर अपने व्यावसायिक नियमों की जांच करने के लिए आवश्यक सभी डेटा शामिल हैं, लेकिन रीड की तरफ वे कहीं भी बैठ सकते हैं।

डेटा के संबंध में, एक आम सिफारिश है कि बाउंडेड कॉन्टेक्ट्स को अपना डेटाबेस (तैनाती और SoC कारणों के लिए) दिया जाए। यदि आप दो बीसी के बीच उत्पादों का मिलान करना चाहते हैं तो आपको शायद समान पहचानकर्ताओं का उपयोग करना होगा।

क्रॉस-बीसी इंटरैक्शन के बारे में, आप /programming/16713041/communicating-between-two-bounded-contexts-in-ddd पर भी एक नज़र डालना चाह सकते हैं


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

यह वह जगह है जहाँ CQRS वास्तव में चमकता है। आप बस एक SQL क्वेरी कर सकते हैं, तालिकाओं में शामिल हो सकते हैं, और एक विशिष्ट दृश्य के लिए सिलवाया क्वेरी वापस कर सकते हैं। यह क्वेरी विधि गड़बड़ से आपके रेपो को भी साफ करता है। इसके अलावा, आप ElasticSearch और इसके खिलाफ क्वेरी जैसी सेवा के डेटा को भी दोहरा सकते हैं।
प्रात: काल

1

DDD उन अनुप्रयोगों के लिए है जहां व्यावसायिक तर्क जटिल है। "कुछ प्रिंट करें" एक जटिल व्यावसायिक तर्क नहीं है। यह वास्तव में व्यावसायिक तर्क नहीं है।

यदि, एक संदर्भ में व्यावसायिक तर्क को कुछ उपयोग मामले को ठीक से संभालने के लिए कुछ जानकारी की आवश्यकता है, तो वह जानकारी उस संदर्भ का हिस्सा है। इसलिए यह विचार कि एक बंधे हुए संदर्भ को अलग-अलग बंधे हुए संदर्भों में उपलब्ध जानकारी की आवश्यकता हो सकती है, इससे कोई मतलब नहीं है, क्योंकि बंधे हुए संदर्भ में उन सभी सूचनाओं की जरूरत होती है।


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

मुझे लगता है कि मैं जो कह रहा हूं वह उत्पाद कैटलॉग डोमेन में उत्पाद कैटलॉग को प्रबंधित करने के लिए आवश्यक सभी जानकारी है। इन्वेंटरी डोमेन में इन्वेंट्री का प्रबंधन करने के लिए आवश्यक सभी जानकारी है। हालाँकि, जब मैं किसी उपयोगकर्ता को कुछ जानकारी प्रदर्शित करना चाहता हूं, और वह डेटा 2 डोमेन से आता है, तो मैं ऐसा कहां करता हूं। क्या मैं अपने UI में दोनों डोमेन लोड कर सकता हूं और उन संपत्तियों को बांध सकता हूं, जिन्हें मैं दिखाना चाहता हूं? या क्या मेरे पास कुछ रिपोर्टिंग / रीडिंग मैकेनिज्म है जहां मैं एक गुमनाम प्रकार या डीटीओ लौटाता हूं जिसमें मेरे यूआई के लिए आवश्यक डेटा है?
पेंडोरपॉल

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

@PendorPaul, मुझे लगता है कि मैं वहीं हूं जहां आप 11 (अब 13) महीने पहले थे। अब आप कहाँ हैं, आपको क्या मिला?
ग्रेग बेल

1
@GregBell आपको एक मानसिकता परिवर्तन के लिए मजबूर करने की आवश्यकता है। मैं "एक डेटाबेस डिजाइन, एक डेटा स्तरीय का निर्माण, कुछ व्यावसायिक तर्क का निर्माण ... आदि" के दृष्टिकोण में फंस गया था। और मैं सभी सम्मिलित संस्थाओं को बनाने पर केंद्रित था। यानी ई-कॉमर्स साइट में एक "उत्पाद", जिसने मूल्य निर्धारण, विवरण, इन्वेंट्री, स्टॉक स्थान से सब कुछ संभाला .... लेकिन यह बेहद जटिल हो गया। बंधे हुए संदर्भ दृष्टिकोण का अर्थ इन्वेंट्री संदर्भ में है, "उत्पाद" में केवल इन्वेंट्री प्रबंधन के लिए जानकारी और व्यवहार शामिल है। विवरण और चित्र एक सामग्री संदर्भ में प्रबंधित किए जाते हैं, मूल्य निर्धारण संदर्भ में मूल्य निर्धारण।
पेंडोरपॉल

1

मेरे दृष्टिकोण से "उत्पाद" के विभिन्न प्रकार हैं - हर बाउंडिंग-प्रसंग "उत्पाद" की अपनी परिभाषा है -डोमेन:

  • सामग्री-प्रबंधन-बाउंडिंग-संदर्भ में एक उत्पाद में एक छवि और एक विवरण पाठ होता है।
  • इन्वेंटरी-बाउंडिंग-संदर्भ में एक उत्पाद के पास स्टॉक-मात्रा, उत्पाद विक्रेता, उत्पाद उपलब्ध होने पर forcasts होता है
  • मूल्य-कैच्यूलेशन-बाउंडिंग-प्रसंग में ऐसे नियम हैं कि किसी उत्पाद की प्रति मात्रा कितनी हो सकती है।

इन सबसे ऊपर मैं अपने स्वयं के उत्पाद-विक्षेप (अन्य बाउंडिंग-प्रसंगों के उत्पाद-डोमेन का एक प्रासंगिक संयोजन) के साथ एक अतिरिक्त शॉप-बाउंडिंग-प्रसंग जोड़ूंगा।

एक दुकान-उत्पाद में "इन्वेंटरी" से सामग्री और उपलब्धता से "छवि और एक विवरण पाठ" होगा, लेकिन इन्वेंट्री से "उत्पाद विक्रेता" नहीं।

यह अतिरिक्त शॉप-बाउंडिंग-कॉनटेक्स्ट बाउंडिंग-कॉन्टेक्ट-एस कंटेंट, इन्वेंटरी, मूल्य पर निर्भर करता है


तो आप उस Shop-Product BC को कैसे बना रहे हैं? उस संदर्भ में क्या आपके पास उत्पाद और इन्वेंटरी ई.पू. का संदर्भ है, और क्या आप स्टोर-उत्पाद बीसी को लोड करते समय अपने दृढ़ता स्टोर से उन लोगों को हाइड्रेट कर रहे हैं, और फिर उन स्टोरों से अपने बीपीओ की संपत्तियों की पेशकश कर रहे हैं जिन्हें आप अपने स्टोरप्लस के गुणों के माध्यम से पेश करते हैं? मुझे यह लेख वास्तव में मिला, जो कि मैं जो सोच रहा था, उसकी तर्ज पर, ईसा पूर्व की घटनाओं को पार कर रहा हूं, लेकिन @ guillaume13 ने बताया है कि प्रदर्शन उद्देश्यों के लिए मैं BC से बच सकता हूं और अपने डेटा को अपने दृश्य के लिए वापस खींच सकता हूं। msdn.microsoft.com/en-us/magazine/dn802601.aspx
PendorPaul
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.