मैं प्रो-रिपॉजिटरी हूं, हालांकि मैं सामान्य रिपॉजिटरी पैटर्न से दूर चला गया हूं। इसके बजाय मैं अपनी रिपॉजिटरी को उनके द्वारा प्रदान किए जाने वाले व्यावसायिक फ़ंक्शन के साथ संरेखित करता हूं। रिपॉजिटरी का उद्देश्य ओआरएम को दूर करना नहीं है, क्योंकि यह कुछ भी नहीं है जिसे मैं बदलने की उम्मीद करता हूं, और साथ ही मैं रिपॉजिटरी को भी दानेदार बनाने से बचता हूं। (यानी CRUD) इसके बजाय मेरे रिपॉजिटरी में दो-से-तीन प्रमुख उद्देश्य हैं:
- डेटा की पुनःप्राप्ति
- डेटा निर्माण
- कड़ा हट जाना
डेटा पुनर्प्राप्ति के लिए, रिपॉजिटरी हमेशा लौटती है IQueryable<TEntity>
। डेटा निर्माण के लिए यह TEntity लौटाता है। रिपॉजिटरी मेरे बेस-लेवल फ़िल्टरिंग को ऑथोराइज़ेशन जैसे "एक्टिव" स्टेट को सिस्टम के लिए हैंडल करता है जो सॉफ्ट-डिलीट पैटर्न का उपयोग करता है, और सिस्टम के लिए "करंट" स्टेट जो कि ऐतिहासिक डेटा का उपयोग करता है। डेटा निर्माण केवल यह सुनिश्चित करने के लिए जिम्मेदार है कि आवश्यक संदर्भ हल किए गए हैं और जुड़े हुए हैं और यह कि इकाई स्थापित की गई है और जाने के लिए तैयार है।
डेटा अपडेट सवाल में संस्थाओं (एस) के साथ काम करने वाले व्यावसायिक तर्क की जिम्मेदारी है। इसमें सत्यापन नियम जैसी चीजें शामिल हो सकती हैं। मैं एक रिपॉजिटरी पद्धति में इनकैप्सुलेट करने की कोशिश नहीं करता।
मेरे अधिकांश सिस्टम में डिलीट सॉफ्ट-डिलीट है इसलिए यह डेटा अपडेट के अंतर्गत आएगा। (IsActive = false) हार्ड-डिलीट के मामले में यह रिपोजिटरी में वन-लाइनर होगा।
रिपोजिटरी क्यों? टेस्ट की क्षमता। ज़रूर, DbContext का मज़ाक उड़ाया जा सकता है, लेकिन जो क्लास में लौटता है उसका मज़ाक उड़ाना ज्यादा आसान हैIQueryable<TEntity>
। वे यूओडब्ल्यू पैटर्न के साथ भी अच्छा खेलते हैं, व्यक्तिगत रूप से मैं मेहदीम के डीबीसीकोटेक्स्टस्कोप पैटर्न का उपयोग करता हूं, जो मैं चाहता हूं कि स्तर पर कार्य की इकाई (एमवीसी में नियंत्रकों) को गुंजाइश देने के लिए और मेरे नियंत्रकों और सहायक सेवा वर्गों को संदर्भों को पास किए बिना रिपॉजिटरी का उपयोग करने दें। UoW / dbContext के आसपास। IQueryable का उपयोग करने का अर्थ है कि आपको रिपॉजिटरी में बहुत सारे रैपर तरीकों की आवश्यकता नहीं है, और आपका कोड ऑप्टिमाइज़ कर सकता है कि डेटा की खपत कैसे होने वाली है। उदाहरण के लिए, रिपॉजिटरी को "एक्जिस्ट" या "काउंट" जैसी विधियों को उजागर करने की आवश्यकता नहीं है, या उन मामलों में अन्य POCO के साथ संस्थाओं को लपेटने का प्रयास करें जहां आप डेटा के उप-सेट चाहते हैं। उन्हें संबंधित डेटा के लिए उत्सुक-लोडिंग विकल्पों को संभालने की भी आवश्यकता नहीं है, जिनकी आपको आवश्यकता हो सकती है या नहीं। IQueryable पास करके, कॉलिंग कोड कर सकते हैं:
.Any()
.Count()
.Include() // Generally avoided, instead I use .Select()
.Where()
.Select(x => new ViewModel or Anon. Type)
.Skip().Take()
.FirstOrDefault() / .SingleOrDefault() / .ToList()
बहुत लचीला है, और एक परीक्षण पीओवी से मेरी नकली रिपॉजिटरी को बस आबादी वाली वस्तुओं की सूची वापस करने की आवश्यकता है।
जेनेरिक रिपॉजिटरी के रूप में, मैं इन सबसे भाग के लिए दूर चला गया हूं क्योंकि जब आप प्रति टेबल रिपॉजिटरी के साथ समाप्त होते हैं तो आपके नियंत्रक / सेवाएं एक बिजनेस एक्शन करने के लिए कई रिपॉजिटरी के संदर्भ के साथ समाप्त होते हैं। ज्यादातर मामलों में, इनमें से केवल एक या दो रिपॉजिटरी वास्तव में लेखन कार्य कर रहे हैं (बशर्ते आप नेविगेशन गुणों का सही तरीके से उपयोग कर रहे हों), जबकि बाकी लोग रीड्स का समर्थन कर रहे हैं। मेरे पास कुछ ऐसा होगा जैसा कि एक OrdersRepository है, जो ऑर्डर बनाने और किसी भी प्रासंगिक लुकअप आदि (हल्के ग्राहक ऑब्जेक्ट्स, उत्पाद आदि) को पढ़ने के लिए और एक ऑर्डर बनाते समय संदर्भ के लिए 5 या 6 विभिन्न रिपॉजिटरी को मारने की तुलना में पढ़ने में सक्षम है। यह DNRY शुद्धतावादियों का उल्लंघन कर सकता है, लेकिन इसके लिए मेरा तर्क यह है कि रिपॉजिटरी का उद्देश्य आदेशों के निर्माण की सेवा करना है जिसमें संबंधित संदर्भ शामिल हैं।Repository<Product>
उत्पादों को प्राप्त करने के लिए जहां एक आदेश के आधार पर मुझे केवल एक मुट्ठी भर क्षेत्रों के साथ एक इकाई की आवश्यकता होती है। मेरे आर्डर रिपॉजिटरी में एक ऐसी .GetProducts()
विधि हो सकती है IQueryable<ProductSummary>
जो मुझे अच्छी लगती है, जो Repository<Product>
कि आवेदन की ज़रूरतों के विभिन्न क्षेत्रों और / या कुछ जटिल पास-इन फ़िल्टरिंग अभिव्यक्ति की कोशिश करने और सेवा करने के लिए कई "गेट" तरीके हैं।
मैं सरल कोड का चयन करता हूं जो पालन करना, परीक्षण करना और धुन करना आसान है। यह बुरे तरीकों से दुरुपयोग किया जा सकता है, लेकिन मेरे पास कुछ ऐसा होगा जहां गालियां आसानी से हाजिर होती हैं और सही तरीके से कोड को "लॉक डाउन" करने की कोशिश करते हैं, इस तरह से कोड का दुरुपयोग नहीं किया जा सकता है, इसमें असफल हो सकते हैं, और फिर कुछ ऐसा है जो है वास्तव में ऐसा करने के लिए एक दुःस्वप्न है कि ग्राहक अंत में क्या करने के लिए भुगतान करता है। :)