एक रिपॉजिटरी को वास्तव में क्या करना चाहिए?


15

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

मेरा मतलब है, क्या रिपॉजिटरी में व्यावसायिक तर्क होना चाहिए, या क्या उन्हें केवल डेटा स्टोर के साथ संवाद करने और सहेजे जाने या लोड होने वाली संस्थाओं का प्रबंधन करने के लिए तर्क होना चाहिए?

यह भी मैंने सुना है कि रिपॉजिटरी समुच्चय के लिए दृढ़ता की इकाइयाँ हैं। लेकिन वह कैसे है? मैं यह समझने में विफल हूं कि यह व्यवहार में कैसे काम करता है। मैंने सोचा था कि हमारे पास बस एक इंटरफ़ेस होना चाहिए IRepositoryजिसमें CRUD विधियां शामिल हैं, और फिर किसी भी इकाई के लिए कार्यान्वयन में डेटा स्टोर से इस तरह के प्रकार को सहेजने और पुनः प्राप्त करने का तर्क होगा।


4
"रिपॉजिटरी में व्यावसायिक तर्क होना चाहिए" - नहीं।
ozz

1
यहाँ एसओ
एरिक किंग

2
मुझे लगता है कि आप "चाहिए" शब्द पर पकड़े जा रहे हैं - रिपॉजिटरी एक विशिष्ट पैटर्न है, आप बोलते हैं कि एक तरह से रेपो होना चाहिए जो कि रेपो करने का सबसे अच्छा तरीका है; यह एक गलत धारणा है क्योंकि रेपो करने का एक तरीका है, और कुछ भी रेपो नहीं होगा। जैसे कि रेपो पैटर्न में ताकत और कमजोरियां होती हैं, लेकिन रेपो के लिए कई दृष्टिकोण नहीं होते हैं। वहाँ रहे हैं डेटा, जिनमें से एक रेपो केवल एक है के साथ बातचीत करने के लिए कई तरीके तथापि। कुछ अन्य डेटा इंटरैक्शन दृष्टिकोणों के लिए यहां पढ़ें
जिमी हॉफ

जवाबों:


14

ठीक है, आप स्प्रिंग डेटा फ्रेमवर्क में एक अच्छा उदाहरण देख सकते हैं जो रिपॉजिटरी की अवधारणा पर आधारित है।

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

तो, यह ढांचा शायद एक अच्छा भंडार डिजाइन का अध्ययन करने के लिए एक अच्छी जगह है।

जहां तक ​​मुझे पता है, स्प्रिंग डेटा फ्रेमवर्क द्वारा लागू की गई कई अवधारणाएँ, डोमेन-ड्रिवेन डिज़ाइन: सॉफ्टवेयर के दिल में टैकलिंग कॉम्प्लेक्सिटी नामक एक महान पुस्तक से आती हैं , पुस्तक में एक पूरा खंड है जो रिपॉजिटरी डिज़ाइन को समर्पित है।

आप इसकी प्रति प्राप्त करने पर विचार कर सकते हैं।

पुस्तक का एक छोटा सा अंश बताता है:

REPOSITORY पैटर्न उन समाधानों को एनकैप करने और हमारे मॉडल फ़ोकस को वापस लाने के लिए एक सरल वैचारिक ढांचा है।

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

ग्राहक क्वेरी विधियों का उपयोग करके REPOSITORY से वस्तुओं का अनुरोध करते हैं जो ग्राहक द्वारा निर्दिष्ट मानदंडों के आधार पर वस्तुओं का चयन करते हैं, आमतौर पर कुछ विशेषताओं का मूल्य। REPOSITORY डेटाबेस क्वेरी और मेटाडेटा मैपिंग की मशीनरी को एनकैप्सुलेट करते हुए अनुरोधित ऑब्जेक्ट को पुनः प्राप्त करता है। REPOSITORIES कई प्रकार के प्रश्नों को कार्यान्वित कर सकता है जो ग्राहक को जो भी मापदंड की आवश्यकता होती है उसके आधार पर वस्तुओं का चयन करते हैं। वे सारांश जानकारी भी वापस कर सकते हैं, जैसे कि कितने उदाहरण कुछ मानदंडों को पूरा करते हैं। वे सारांश गणना भी लौटा सकते हैं, जैसे कि कुछ संख्यात्मक विशेषता के सभी मिलान वस्तुओं पर कुल।

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

इसलिए:

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

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


4

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

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

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