14

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

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

संक्षेप में, यहाँ समस्या है:

- आप इकाई की रूपरेखा का उपयोग करने के लिए जा रहे हैं, तो आप अपने खजाने लौटने IQueryable <SomeType> चाहते हैं।

- यदि आप हार्ड-कोडेड सूचियों का उपयोग करने जा रहे हैं, तो आप नहीं चाहते हैं कि आपके भंडार IQueryable लौट रहे हों, क्योंकि यह ओवरहेड पर भारी रूप से जोड़ता है, और साथ ही, लिंक से इकाइयों को लिंक से ऑब्जेक्ट्स में काफी अलग होता है, जिससे कई कोड में सिरदर्द जो दोनों प्रदाताओं के लिए आम है।

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

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

रिपोजिटरी का पूरा विचार इस परत के रूप में बहुत पतला है और केवल डेटाबेस से कनेक्ट होता है तो खो जाता है - भंडार व्यापार तर्क के साथ-साथ डेटा स्टोर कनेक्टिविटी के "भंडार" होते हैं। आप केवल ढूँढें, सहेजें, अपडेट करें, आदि

मैं प्रदाता-निर्भर कोड को अलग करने और केंद्रीकृत स्थान में व्यावसायिक तर्क रखने के बीच इस विसंगति को हल करने में असमर्थ रहा हूं।

कोई विचार? अगर कोई मुझे इस कार्यान्वयन के एक उदाहरण के लिए इंगित कर सकता है जो इस चिंता को संबोधित करता है, तो मैं सबसे अधिक सराहना करता हूं। (मैं एक बहुत पढ़ा है, लेकिन कुछ भी है कि विशेष रूप से इन मुद्दों के बारे में बात करती है नहीं मिल सकता है।)

अद्यतन:

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

लेकिन फिर यह सवाल उठता है कि भंडार का उपयोग क्यों करें, और विशेष रूप से भंडार इंटरफेस का उपयोग क्यों करें। मैं इस पर काम कर रहा हूँ।मुझे लगता है कि सर्वोत्तम अभ्यास का निर्धारण थोड़ा सा शोध करने जा रहा है।

+0

IQueryable के बारे में एक और पोस्ट: http: // stackoverflow।com/प्रश्न/718624/to-return-iqueryablet-or-not-return-iqueryablet – aqwert

+0

संक्षेप में, यह राज्य को बताता है कि मुझे लगता है कि हर कोई खुद को पाता है और सीखने के दौरान लाइन के साथ किसी बिंदु पर उनके प्रश्न हैं .net/एमवीसी/ef/डिजाइन पैटर्न। उपयोगी प्रश्न और उत्तर –

उत्तर

14

मैं क्या कह सकता हूं? क्लब में आपका स्वागत है ...

आपको जो मिला वह कई डेवलपर्स द्वारा प्राप्त समस्या है जो ईएफवी 4 के साथ "रिपोजिटरी बूम" का पालन करते हैं। हां यह समस्या है और समस्या वास्तव में जटिल है।

मूल रूप से अपने प्रस्तावित तरीका एक है: क्यों रिपोजिटरी प्रयोग

अलग विषय है: मैं इस पर कई बार चर्चा कीसमाधान लेकिन क्या आप वास्तव में इसे चाहते हैं? मेरी राय में परिणाम भंडार नहीं है लेकिन डेटा एक्सेस ऑब्जेक्ट (डीएओ) ने बहुत से एक्सेस विधियों का खुलासा किया है। Martin Fowler द्वारा भंडार परिभाषा है:

भंडार डोमेन और डेटा मानचित्रण परतों के बीच मध्यस्थता करता है, एक में स्मृति डोमेन वस्तु संग्रह की तरह अभिनय। क्लाइंट ऑब्जेक्ट्स क्वेरी विनिर्देशों का घोषणा करते हैं और उन्हें संतुष्टि के लिए रिपोजिटरी में सबमिट करते हैं। वस्तुओं को जोड़ा जा सकता है और हटाया भंडार से, के रूप में वे कर सकते हैं मानचित्रण कोड भंडार द्वारा समझाया वस्तुओं की एक सरल संग्रह, और से बाहर उचित संचालन पर्दे के पीछे ले जाएगा। संकल्पनात्मक रूप से, रेपोजिटरी डेटा स्टोर में ऑब्जेक्ट्स के सेट को समाहित करता है और उन पर किए गए संचालन, दृढ़ता परत के अधिक ऑब्जेक्ट-उन्मुख दृश्य प्रदान करता है। रिपोजिटरी के उद्देश्य को स्वच्छ पृथक्करण और डोमेन और डेटा मैपिंग परतों के बीच एक तरफा निर्भरता प्राप्त करने के उद्देश्य का भी समर्थन करता है। संग्रहीत प्रक्रिया (फिक्स्ड क्वेरी) प्रति एक अभिगम विधि -

मैं IQueryable उजागर मानते हैं कि यह 100 गुना संग्रहित प्रक्रियाओं युग से खजाने के लिए इसी तरह एक सार्वजनिक इंटरफेस बनाने तो बेहतर पूरा करता है।

समस्या leaky abstraction के नियम द्वारा सारांशित की जा सकती है। IQueryable डेटाबेस क्वेरी का एक सार तत्व है लेकिन IQueryable द्वारा प्रदान की गई सुविधाएं प्रदाता पर निर्भर हैं। विभिन्न प्रदाता = अलग सुविधा सेट।

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

+0

वाह, पढ़ने के लिए बहुत कुछ! मुझे इस पर सभी को उछाल दो, और मैं कल तुम्हारे पास वापस आऊंगा। – Cynthia

+0

मैं आपके उदाहरणों के माध्यम से भाग-मार्ग हूं। मुझे आपके बयान में से एक के साथ कोई समस्या है: "पहला कारण किसी प्रकार की आर्किटेक्टोनिक शुद्धता और महान विचार है कि यदि आप अपनी ऊपरी परतें ईएफ पर स्वतंत्र करते हैं तो आप बाद में अन्य दृढ़ता ढांचे पर स्विच कर सकते हैं। आपने कितनी बार ऐसा देखा वास्तविक दुनिया में बात? " असल में मुझे इसे दो साल पहले करना था, मेरी पहली एमवीसी परियोजना। मैं ईएफ कोड-प्रथम का उपयोग कर रहा था, लेकिन मुझे इसके माध्यम से एहसास हुआ कि इससे पहले कि मुझे इसकी आवश्यकता हो, आरटीएम नहीं होगा, इसलिए मुझे समय के दबाव में दृढ़ता से टाइप किए गए डेटासेट पर स्विच करना पड़ा। (जारी ...) – Cynthia

+0

मुझे एक नया भंडार बनाना पड़ा, और मुझे IQueryable के बजाय आईन्यूमेरेबल को वापस करने के लिए जल्दबाजी में सभी रिपोजिटरी इंटरफेस को बदलना पड़ा, और वचन दिया कि मैं कभी भी इस तरह अटक नहीं जाऊंगा। शायद अब एक मुद्दा कम है कि ईएफ 4.1 बाहर है, लेकिन यह अनुभव मेरे दिमाग में देखा गया है - मुझे वास्तव में एक विशिष्ट तकनीक पर निर्भर होने वाले भंडारों के विचार पसंद नहीं हैं, हालांकि मैं आपका बिंदु देखता हूं। बाद में ... – Cynthia

संबंधित मुद्दे