मुझे लगता है कि आप एक बिंदु को याद कर चुके हैं कि लोग रिपोजिटरी पैटर्न क्यों लागू करते हैं जब ईएफ ऑब्जेक्टसेट/डीबीसेट के माध्यम से पहले ही रिपोजिटरी पैटर्न लागू करता है?
लोकप्रिय उत्तर इसलिए होगा क्योंकि कई ट्यूटोरियल सलाह देते हैं कि आप इसे उचित कारणों के बिना उपयोग करें। वैध कारण हैं ऑब्जेक्टसेट/डीबीसेट पर रिपोजिटरी परत का उपयोग न करें। हालांकि मैं कुछ कारण बताऊंगा कि यह क्यों बेहतर है।
डिफ़ॉल्ट फ़िल्टर वास्तविक जीवन अनुप्रयोगों में कई स्थितियां हैं जहां आपको डिफ़ॉल्ट फ़िल्टर की आवश्यकता होती है। उदाहरण के लिए बंद उत्पादों को बेचा नहीं जाता है। यदि आप सीधे उत्पाद ऑब्जेक्टसेट/डीबीसेट को बेनकाब करते हैं तो कोई समस्या होगी यदि कोई डिफ़ॉल्ट फ़िल्टर लागू करना भूल गया हो। यह तर्क के दोहराव से भी बचाता है। आप समस्याओं को तोड़ने के बाद बाद में डिफ़ॉल्ट फ़िल्टर को भी संशोधित कर सकते हैं।
public IQueriable<Product> GetAll()
{
return context.Products.Where(p => !p.IsDiscontinued);
}
शीतल हटाता कई एप्लिकेशन नरम हटाए गए जहां बिना वास्तव में पंक्ति को हटाने के इस तरह के IsDeleted
के रूप में एक स्तंभ रखने का उपयोग करें।अब ऑब्जेक्टसेट/डीबीसेट में Delete
विधि है लेकिन एक बार जब आप इस विधि को कॉल करते हैं तो यह null
मानों को निरर्थक FK गुणों को असाइन करेगा। आप यह नहीं चाहते हैं।
public void Delete(Product product)
{
// can apply any other logic here
product.IsDeleted = true;
}
केवल संस्थाओं कई स्थिति है जहाँ कोई अन्य एप्लिकेशन, बनाने को हटाने और संस्थाओं को अद्यतन करने के लिए और अपने आवेदन केवल इकाई प्रदर्शित कर रहा है के प्रभारी हैं कर रहे हैं पढ़ें। लेकिन ऑब्जेक्टसेट/डीबीसेट इस मामले में असमर्थित कार्यक्षमता का खुलासा करता है। इस मामले में एक और लाभकारी इकाई भौतिकरण समय को कम करने के लिए NoTracking
विकल्प का उपयोग करना होगा।
कार्यान्वयन को उजागर किए बिना डेटा एक्सेस स्विच ऐसे अवसर हैं जहां LINQ पर्याप्त नहीं है। यहां आप कच्चे एसक्यूएल या एसपी का उपयोग कर सकते हैं। एक भंडार होने से पूछताछ/अद्यतन करने के विभिन्न तरीकों को उजागर करने से बचेंगी जब ईएफ द्वारा उजागर कार्यक्षमता पर्याप्त नहीं है।
मौजूदा डेटाबेस के साथ काम करना जब आपके पास डेटाबेस बनाने का विलासिता नहीं है जो ईएफ हैंडलिंग करने में सक्षम है। मौजूदा तालिका में Sql Variant
, XML
कॉलम हो सकते हैं। डेटाबेस की अखंडता को बनाए रखने के लिए आपको अन्य तालिकाओं और अनगिनत अन्य मामलों में प्रविष्टियों का डुप्लिकेट करना होगा।
ये तकनीक बुलेट प्रूफ नहीं हो सकती है लेकिन स्थिति की मांग होने पर काम में आ जाएगा। मैं जो सुझाव दूंगा वह सीधे उन रिपॉजिटरीज़ में कूदने के बिना है जो आप बेहतर कार्यशीलताओं को लागू करने के लिए आवश्यक एक और अमूर्त परत जोड़ते हुए बेहतर सोचते हैं।
ईएफ पहले से ही आपके भंडारण पर एक अमूर्त नहीं है? आपको इसे फिर से लपेटने की आवश्यकता क्यों है? एक भंडार में आप वास्तव में यूनिट परीक्षण क्या करते हैं? –
@EstebanAraya - आप आम तौर पर इकाई-परीक्षण भंडार नहीं करते हैं (आप उन्हें एकीकरण-परीक्षण करते हैं)। एक रिपोजिटरी इंटरफेस इंजेक्शन करके आप उस डेटाबेस से स्वतंत्र अन्य कक्षाओं (व्यावसायिक तर्क) को यूनिट-टेस्ट करने के लिए नकल कर सकते हैं। नकली आपके परीक्षणों की आवश्यकता वाले पीओसीओ के जो भी संग्रह वापस कर सकती है। – TrueWill
ईएफ एक अमूर्त है जो ऑब्जेक्ट मैपिंग, इकाई/परिवर्तन ट्रैकिंग प्रदान करता है। भंडार डेटा तक पहुंचने के लिए उपयोग किए जाने वाले व्यावसायिक तर्क को लपेटता है। तर्क की तरह @ एरंगा के जवाब में वर्णित किया गया था। i.e उत्पादों को पूछताछ लेकिन बंद उत्पादों को छोड़कर। रेपॉजिटरी पैटर्न का उपयोग करके, आप सुनिश्चित करते हैं कि अंतर्निहित डेटा तक पहुंचने पर आपके व्यावसायिक नियमों का हमेशा पालन किया जाता है। – BZink