डीडीडी - क्या एक समग्र रूट का रिपॉजिटरी एग्रीगेट्स को बचाता है?


27

मैं एक मौजूदा एप्लिकेशन के ग्रीनफील्ड मॉड्यूल के लिए DDD जैसा दृष्टिकोण उपयोग कर रहा हूं; यह वास्तुकला के कारण 100% डीडीडी नहीं है, लेकिन मैं कुछ डीडीडी अवधारणाओं का उपयोग करने की कोशिश कर रहा हूं। मेरे पास एक बाध्य संदर्भ है (मुझे लगता है कि यह उचित शब्द है - मैं अभी भी डीडीडी के बारे में सीख रहा हूं) जिसमें दो एंटिटीज शामिल हैं: Conversationऔर Message। वार्तालाप जड़ है, क्योंकि संदेश वार्तालाप के बिना मौजूद नहीं है, और सिस्टम के सभी संदेश वार्तालाप का हिस्सा हैं।

मेरे पास एक ConversationRepositoryवर्ग है (हालांकि यह वास्तव में एक गेटवे की तरह है, मैं "रिपॉजिटरी" शब्द का उपयोग करता हूं) जो डेटाबेस में वार्तालाप पाता है; जब यह एक वार्तालाप पाता है तो यह उस रूपांतरण के लिए संदेशों की एक सूची (कारखानों के माध्यम से) भी बनाता है (एक संपत्ति के रूप में उजागर)। यह चीजों को संभालने का सही तरीका प्रतीत होता है क्योंकि इसमें पूर्ण-विकसित MessageRepositoryवर्ग की आवश्यकता प्रतीत नहीं होती है क्योंकि यह केवल तभी मौजूद होता है जब वार्तालाप पुनः प्राप्त होता है।

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

जवाबों:


25

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

जिन 2 संस्थाओं का आप उल्लेख कर रहे हैं, उनका समूह बाउंडेड संदर्भ नहीं है - यह शायद एक अलग है। प्रत्येक Aggregate में एक Aggregate Root, एक Entity होती है जो अन्य सभी वस्तुओं के लिए Aggregate में एक सिंगल एंट्री पॉइंट के रूप में कार्य करती है। तो एक प्रत्यक्षता और दूसरे समुच्चय में एक अन्य इकाई के बीच कोई सीधा संबंध नहीं है जो कि एग्रीगेट रूट नहीं है।

अन्य वस्तुओं के ट्रैवर्सल द्वारा आसानी से प्राप्त नहीं की जाने वाली संस्थाओं को पकड़ने के लिए भंडार की आवश्यकता होती है। रिपॉजिटरी में आमतौर पर एग्रीगेट रूट होते हैं, लेकिन रेगुलर एंटिटीज के रिपोजिटरी भी हो सकते हैं।

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

बातचीत को बनाए रखने के लिए कन्वर्सेशन रिपॉजिटरी एक भूमिका निभाएगी, लेकिन ऐसी सीधी भूमिका नहीं, जैसा कि आप उल्लेख करते हैं। इसलिए, वार्तालाप Addepessitory पर कोई AddMessage () नहीं है (बल्कि यह विधि स्वयं वार्तालाप में है) लेकिन इसके बजाय, प्रत्येक बार रिपॉजिटरी एक वार्तालाप को जारी रखेगा, एक ही समय में अपने संदेशों को जारी रखने के लिए एक अच्छा विचार है, या तो पारदर्शी रूप से यदि आप एक ORM ढांचे का उपयोग करते हैं। जैसे (एन) हाइबरनेट, यदि आप ऐसा चुनते हैं, तो तदर्थ एसक्यूएल का उपयोग करना आदि।


1
यदि कोई समग्र रूट, जैसे वार्तालाप, इसके भीतर कई अलग-अलग निकाय प्रकार होते हैं, जैसे कि संदेश, थिंकिंग, और विंग्स, तो जब आप किसी वार्तालाप को सहेजते हैं, जैसे वार्तालाप वार्तालाप (वार्तालाप), तो आपको यह कैसे करना चाहिए कि इसके भीतर किन संस्थाओं की आवश्यकता है बचाने होने के लिए? ऊपर दिए गए उदाहरणों में, केवल संदेश संस्थाओं को सहेजने की आवश्यकता है। क्या आप आईडी के बिना संस्थाओं को खोजने के लिए मूल रूट के भीतर सभी संभावित संग्रहों को पार करते हैं?
क्रिस-रिचर्ड्स

3

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


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