अच्छी तरह से, यह सुनिश्चित नहीं है कि यह सही शीर्षक है, लेकिन मूल रूप से मुझे एमवीसी अनुप्रयोगों में रिपॉजिटरीज़ का उपयोग करके बहुत सारी समस्याएं आ रही हैं, जिससे आप एक सेट रिपोजिटरी को प्रतिस्थापित कर सकते हैं, किसी अन्य के लिए एक अलग डेटा स्टोरेज तकनीक को लागू करना।एकाधिक प्रदाताओं का समर्थन करने के लिए रिपोजिटरी पैटर्न का उपयोग
उदाहरण के लिए, मान लीजिए कि मैं अपने आवेदन के लिए इकाई फ्रेमवर्क का उपयोग करना चाहता हूं। हालांकि, मैं हार्ड-कोडित सूचियों में लागू परीक्षण डेटा का एक सेट भी रखना चाहता हूं। मैं इंटरफेस का एक सेट (IUserRepository, IProductRepository, आदि रखना चाहता हूं - चलो अब अधिक सामान्य आईरिपॉजिटरी < टी > के बारे में बात नहीं करते हैं) कि दोनों दृष्टिकोण तत्काल हो सकते हैं। फिर, (निर्भर) एक निर्भरता इंजेक्शन उपकरण जैसे कि निनजेक्ट या कैसल विंडसर का उपयोग करके, मैं इकाई फ्रेमवर्क प्रदाता (वास्तविक डेटाबेस तक पहुंच) और परीक्षण प्रदाता (सूचियों तक पहुंच) के बीच आगे और पीछे स्विच कर सकता हूं।
संक्षेप में, यहाँ समस्या है:
- आप इकाई की रूपरेखा का उपयोग करने के लिए जा रहे हैं, तो आप अपने खजाने लौटने IQueryable <SomeType> चाहते हैं।
- यदि आप हार्ड-कोडेड सूचियों का उपयोग करने जा रहे हैं, तो आप नहीं चाहते हैं कि आपके भंडार IQueryable लौट रहे हों, क्योंकि यह ओवरहेड पर भारी रूप से जोड़ता है, और साथ ही, लिंक से इकाइयों को लिंक से ऑब्जेक्ट्स में काफी अलग होता है, जिससे कई कोड में सिरदर्द जो दोनों प्रदाताओं के लिए आम है।
दूसरे शब्दों में, मैंने पाया है कि सबसे अच्छा तरीका भंडार के भीतर सभी ईएफ-निर्भर कोड को अलग करता है, ताकि रिपोजिटरी स्वयं आईनेमरेबल या आईलीस्ट या कुछ ऐसे लौट सकें - तो दोनों ईएफ और कुछ अन्य तकनीक का उपयोग कर सकते हैं वही भंडार इस प्रकार, सभी IQueryable ईएफ भंडारों के भीतर निहित होगा। इस तरह, आप ईएफ रिपोजिटरी के साथ लिंक से इकाइयों का उपयोग कर सकते हैं, और टेक्स रिपॉजिटरीज़ के साथ ऑब्जेक्ट्स के लिए लिंक कर सकते हैं।
फिर भी यह दृष्टिकोण रिपॉजिटरीज़ में व्यावसायिक तर्क की एक बड़ी राशि डालता है, और इसके परिणामस्वरूप अधिक डुप्लीकेट कोड होता है - प्रत्येक रिपॉजिटरीज़ में तर्क को डुप्लिकेट किया जाना चाहिए, भले ही कार्यान्वयन कुछ अलग हो।
रिपोजिटरी का पूरा विचार इस परत के रूप में बहुत पतला है और केवल डेटाबेस से कनेक्ट होता है तो खो जाता है - भंडार व्यापार तर्क के साथ-साथ डेटा स्टोर कनेक्टिविटी के "भंडार" होते हैं। आप केवल ढूँढें, सहेजें, अपडेट करें, आदि
मैं प्रदाता-निर्भर कोड को अलग करने और केंद्रीकृत स्थान में व्यावसायिक तर्क रखने के बीच इस विसंगति को हल करने में असमर्थ रहा हूं।
कोई विचार? अगर कोई मुझे इस कार्यान्वयन के एक उदाहरण के लिए इंगित कर सकता है जो इस चिंता को संबोधित करता है, तो मैं सबसे अधिक सराहना करता हूं। (मैं एक बहुत पढ़ा है, लेकिन कुछ भी है कि विशेष रूप से इन मुद्दों के बारे में बात करती है नहीं मिल सकता है।)
अद्यतन:
मुझे लगता है कि मुझे लगता है कि यह शायद खजाने जो कर सकते हैं के लिए संभव नहीं है शुरू कर विभिन्न प्रदाताओं के लिए स्वैप आउट किया जाए - यदि आप एंटीटी फ्रेमवर्क का उपयोग करने जा रहे हैं, उदाहरण के लिए, आपको बस अपना पूरा एप्लिकेशन एंटिटी फ्रेमवर्क में समर्पित करना होगा। यूनिट परीक्षण? मैं इसके साथ संघर्ष कर रहा हूँ। इस बिंदु पर मेरा अभ्यास हार्ड-कोड किए गए डेटा के साथ एक अलग भंडार स्थापित करना है और यूनिट परीक्षण के लिए इसका उपयोग करना है, साथ ही डेटाबेस स्थापित होने से पहले एप्लिकेशन का परीक्षण करने के लिए भी किया गया है। मुझे लगता है कि मुझे एक अलग समाधान, शायद कुछ मॉकिंग टूल देखना होगा।
लेकिन फिर यह सवाल उठता है कि भंडार का उपयोग क्यों करें, और विशेष रूप से भंडार इंटरफेस का उपयोग क्यों करें। मैं इस पर काम कर रहा हूँ।मुझे लगता है कि सर्वोत्तम अभ्यास का निर्धारण थोड़ा सा शोध करने जा रहा है।
IQueryable के बारे में एक और पोस्ट: http: // stackoverflow।com/प्रश्न/718624/to-return-iqueryablet-or-not-return-iqueryablet – aqwert
संक्षेप में, यह राज्य को बताता है कि मुझे लगता है कि हर कोई खुद को पाता है और सीखने के दौरान लाइन के साथ किसी बिंदु पर उनके प्रश्न हैं .net/एमवीसी/ef/डिजाइन पैटर्न। उपयोगी प्रश्न और उत्तर –