उदाहरण: आपके डेटाबेस में "ग्राहकऑर्डरर्स ऑनहोल्ड" नामक एक SQL व्यू है। यह दृश्य विशिष्ट ग्राहक और ऑर्डर डेटा फ़ील्ड के फ़िल्टर किए गए मिश्रण को लौटाता है। आपको अपने आवेदन में इस दृश्य से डेटा लाने की आवश्यकता है। ऐसे दृश्य तक पहुंच कैसे भंडार पैटर्न में फिट होती है? क्या आप "ग्राहक ऑर्डर ऑनहोल्ड रिपोजिटरी" बनाएंगे? क्या केवल पढ़ने योग्य दृश्य है जैसे कि इसे कुल रूट माना जाता है?केवल-पढ़ने वाले डेटाबेस दृश्य रिपोजिटरी पैटर्न में कैसे फ़िट होते हैं?
उत्तर
मैं पढ़ने के भंडार को अलग पसंद करेंगे, अधिमानतः भी Finder के लिए इसका नाम बदल सकते हैं या रीडर, भंडार के लिए है डोमेन उपयोग के लिए केवल पढ़ने के लिए डेटा पूछने के लिए नहीं, आप this article और this देख सकते हैं जो खोजक पृथक फॉर्म भंडार का उपयोग बताता है।
मैं भी लिखने मॉडल वास्तुकला CQRS और there
से पढ़ने के मॉडल के अलग सिफारिश करेंगे यह वास्तुकला तुम भी डाटा संग्रहण और घटना सोर्सिंग के उपयोग के मामले में लिखने मॉडल से पढ़ने के मॉडल को अलग करने के लिए अनुमति देता है।
एक मध्यम समाधान तुम सिर्फ ढूँढ़ने से भंडार को अलग करके डेटाबेस को अलग करने की जटिलता के बिना कुछ CQRS अवधारणाओं का उपयोग कर सकते के लिए, समाधान के इस प्रकार का एक नमूना के लिए इस post
पढ़ा (एक ही डाटाबेस लेकिन अलग ढूँढ़ने का उपयोग फॉर्म रिपॉजिटरीज) this sample
मुझे लगता है कि यह "CustomerOrdersOnHoldRepository" की तरह एक अलग भंडार के लिए ठीक है। भंडार का इंटरफ़ेस इस तथ्य को प्रतिबिंबित करेगा कि वस्तुएं केवल पढ़ने योग्य हैं (सहेजें/जोड़ें/मेकपर्सिस्टेंट विधि को परिभाषित न करके)।
... लेकिन वहाँ एक और रणनीति है मैं काफी की तरह है कि: कई डेटा संग्रह स्थान। हमारे ऑर्डरिंग उदाहरण में कोई कारण नहीं है कि हम दो रेपॉजिटरीज़: ऑलऑर्डर और सरचार्ज ऑर्डर कर सकते हैं। ऑलऑर्डर सिस्टम में प्रत्येक ऑर्डर वाले एक सूची का प्रतिनिधित्व करते हैं, SurchargedOrders इसके सबसेट का प्रतिनिधित्व करता है।
मैं वस्तु एक Aggrgate रूट लौटे कॉल नहीं होता। समेकन स्थिरता, डेटा एक्सचेंज और जीवन चक्र के लिए हैं। आपकी वस्तुओं में इनमें से कोई भी नहीं है। ऐसा लगता है कि उन्हें वैल्यू ऑब्जेक्ट्स ('विशेषता या विशेषता') के रूप में भी वर्गीकृत नहीं किया जा सकता है। वे सिर्फ स्टैंडअलोन कक्षाएं हैं।
मैं अपने स्वयं के भंडार को देखने की ओर झुका रहा था, हालांकि, यह मेरी समझ है कि भंडार केवल कुल जड़ें (http://thinkddd.com/glossary/aggregate-root/) पर चलते हैं। –
यह नियम कुल के आंतरिक भागों तक सीधे पहुंच से बचने के बारे में है। आपके पास इन आंतरिक भागों नहीं हैं, जैसे आपके पास कोई आविष्कार और जीवन चक्र नहीं है। इन वस्तुओं को भंडार से वापस करना ठीक है। यदि आप चाहें तो कुल रूट्स को कॉल करें लेकिन यह थोड़ा भ्रामक हो सकता है। – Dmitry
आपके पढ़ने-योग्य डेटा को डीडीडी दुनिया में मूल्य वस्तु माना जाएगा।
मैं आम तौर पर ऐसे समय है कि यह समझ में आता है एक अलग भंडार बनाने के लिए जब तक मौजूदा खजाने में मूल्य की वस्तुओं के लिए पहुँच तरीकों जगह। यह एक विधि है कि राज्यों के एक स्थिर सूची एक पते प्रपत्र पर इस्तेमाल किया जा करने के लिए वापस हो सकता है के समान है:
IAddressRepository
{
Address GetAddress(string addressID);
List<string> GetStates(string country);
}
तो आपके परिदृश्य में, यदि मेरे पास ग्राहक रिपोजिटरी या ऑर्डर रिपोजिटरी है तो मैं इनमें से किसी एक संग्रह में एक विधि जोड़ूंगा? यानी 'ICustomerRepository.GetCustomerOrdersOnHold (args) 'या' IOrderRepository.GetCustomerOrdersOnHold (args) '? –
मुझे लगता है कि यह सबसे अच्छा जवाब है। इस प्रकार के डेटा/ऑब्जेक्ट्स डोमेन के साथ कुछ लेना देना नहीं है, और जैसा कि मोहम्मद ने इंगित किया है, शब्द भंडार समेकन/डोमेन/लेनदेन से जुड़ा हुआ है, इसलिए इस शब्द का उपयोग भ्रामक हो सकता है। सीक्यूआरएस का उद्देश्य इस सटीक मुद्दे को हल करना है। मैंने थोड़ी देर पहले एक समान प्रश्न पूछा: http://stackoverflow.com/questions/2098112/ddd-how-to-implement-performant-repositories-for- खोज –
महान लिंक के कारण महान उत्तर। इससे मुझे अपने कोड को एक अलग और स्पष्ट परिप्रेक्ष्य से देखने में मदद मिली। –
यदि आपके पास कोई खोजक है, तो आप "सेवर" का नाम कैसे देते हैं? भंडार? लेकिन फिर एक भंडार डेटा AKA "क्वेरी" तक पहुंचने में सक्षम होना चाहिए ... इसे कैसे हल करें? – JorgeeFG