क्या ASP.net 5 और EF7 में किसी भी तरह के रिपोजिटरी की जरूरत है?


9

मैंने ईथ टीम में जीथब पर एक प्रश्न पोस्ट किया। मुझे उत्तर मिला कि यह प्रश्न यहाँ पूछना बेहतर होगा इसलिए मैं इसे यहाँ कॉपी और पेस्ट करूँगा क्योंकि हम एक लिंक के रूप में हैं ताकि अन्य GitHub पर कुछ उत्तर देख सकें।

प्रश्न: मैं कुछ शोध कर रहा था और किसी ने बताया कि DBContext क्लास राज्यों की लाइन 24

DbContext, यूनिट ऑफ वर्क एंड रिपोजिटरी पैटर्न का एक संयोजन है।

क्या इसका मतलब यह है कि हमें EF को रिपॉजिटरी में अमूर्त करने की जरूरत नहीं है और फिर कंट्रोलर्स में इसे इंजेक्ट करने के लिए उपयोग और इंटरफ़ेस का उपयोग करें?

जीथब पर मूल पोस्ट: https://github.com/aspnet/EntityFramework/issues/4899

इसका कारण यह है कि मुझे लगता है कि मैं एक ऐसे स्थान पर जा रहा हूं जहां GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, आदि जैसे रिपॉजिटरी में बहुत सारे तरीकों को जोड़ा जा रहा है। और यह मेरे दिमाग में रेपो को गंदा कर रहा है।


1
आपके द्वारा दिए गए उत्तर रोवनमिलर के बारे में आप क्या सोचते हैं ? मुझे पूरी तरह से उचित लगता है।
रॉबर्ट हार्वे

@RobertHarvey हाँ, यह एक अच्छा जवाब था, लेकिन मैं यह देखना चाहता हूं कि दूसरे लोग विषय के बारे में कैसा महसूस करते हैं, इससे पहले कि मैं रिपॉजिटरी का फैसला
करूं

यह भी देखें कि खो दिया गया हैhttp://www.jimmybogard/2009/09/11/wither-the-repository जहां बोगार्ड इसी तरह का तर्क देता है।
मकनज़

ईएफ (और अन्य ओआरएम) रिपोजिटरी क्यों नहीं हैं, इस पर मेरी राय है
एरिक किंग

एक रिपॉजिटरी में GetWithIncludesABC जैसी विधि नहीं होगी। रिपॉजिटरी पैटर्न एक अमूर्त है, मूल रूप से, एक संग्रह के रूप में एक डेटाबेस तालिका। आमतौर पर, संग्रह (जैसे LINQ द्वारा) को क्वेरी करना संभव है, और रिपॉजिटरी फिर क्वेरी को SQL में परिवर्तित करती है। क्या आप एक डाटा गेटवे की तरह लगता है के बारे में बात कर रहे हैं।
श्री कोच २

जवाबों:


12

यदि आप एक रिपॉजिटरी की तरह तरीके जोड़ रहे हैं

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

तब आप सर्विस लेयर पर जाना बेहतर समझते हैं, और सर्विस लेयर को सीधे EF का उपयोग करने देते हैं। EF में पहले से ही उपरोक्त विधियों के समान कार्यक्षमता है जो आप केवल अंतहीन डुप्लिकेट कर रहे हैं।

एक सेवा परत बिजनेस डोमेन विधियों को उजागर करती है, और उन्हें लागू करने के लिए CRUD का उपयोग करती है। उदाहरण के लिए, आपके पास एक विधि हो सकती है TransferMoney(A, B), जहां ए और बी खातों की जांच कर रहे हैं। इससे आप अपने व्यावसायिक डोमेन की भाषा बोल सकते हैं, जबकि सर्विस लेयर आपके लिए CRUD को संभालता है।

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


हालाँकि आप dbset का मजाक उड़ा सकते हैं ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot

4

रॉबर्ट हार्वे ने अपने जवाब में कहा:

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

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

यदि आप "रिपॉजिटरी" के बाहर ईएफ क्वेरी एपीआई का उपयोग कर रहे हैं, तो किसी प्रकार की सेवा ऑब्जेक्ट में, मैं कहूंगा कि आप पैटर्न को तोड़ रहे हैं।

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

मूलतः, एंटिटी फ्रेमवर्क रिपॉजिटरी पैटर्न में गेटवे ऑब्जेक्ट की जगह लेता है । मैं इसे स्वयं भंडार के रूप में नहीं देखता।


सर्विस लेयर पहलू से रिपॉजिटरी कैसे भिन्न होती है? मैं क्या पा सकता हूँ अगर im वापस लौटता है IQueryable तो अनिवार्य रूप से एक रिपॉजिटरी im अगर im वापस आ रहा है IEnumerable तो im एक सेवा परत का उपयोग कर। क्या ये सही है? क्या सेवा परत और रिपोजिटरी पैटर्न समान हैं?
लोरेन। डोरेज़ 16

@ Loren.Dorez: एक सर्विस लेयर के पास बिजनेस डोमेन-विशिष्ट तरीके हैं, जैसे TransferFunds()और BuildWidget()। एक रिपॉजिटरी में सिर्फ CRUD तरीके होते हैं।
रॉबर्ट हार्वे

तो सर्विस लेयर और रिपॉजिटरी दोनों सीधे DBContext को एक्सेस करेंगे? तो आप CRUD को रेपो और गेट मेथड्स एंड अदर मेथड्स इन सर्विस लेयर में डालेंगे? क्या मैं इसे सही तरीके से समझता हूं?
लोरेन। डोरेज़

सर्विस लेयर रिपॉजिटरी को एक्सेस कर सकता है, यदि आपके पास सीधे ईएफ के बजाय एक है।
रॉबर्ट हार्वे

@RobertHarvey क्या आप मुझे ऊपर दिए गए मेटल्स का उपयोग करके एक उदाहरण दिखा सकते हैं? अब के रूप में im एक उलझन उलझन में im।
लोरेन। डोरेज़

1

रिपॉजिटरी की जरूरत नहीं लगती - Microsoft अपने सैंपल बैकएंड माइक्रोसॉफ़्ट एप्लिकेशन में इनका उपयोग नहीं करता है:

https://github.com/Microsoft/BikeSharing360_BackendServices

नमूना BikeSharing एप्लिकेशन कनेक्ट () पर दिखाया गया था; घटना (मुझे लगता है कि यह एपीआई परियोजनाओं के लिए एक टेम्पलेट के रूप में इस्तेमाल किया जा सकता है):

https://blogs.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikesharing360-on-github/

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