2012-01-23 10 views
9

एंटिटी फ्रेमवर्क में रिपोजिटरी पैटर्न से निपटने के दौरान हम स्टोर प्रक्रियाओं और जटिल प्रकारों का उपयोग कैसे कर सकते हैं? क्या कोई भी एक साधारण उदाहरण दे सकता है।ईएफ में रिपोजिटरी पैटर्न का उपयोग करके स्टोर प्रक्रिया और कॉम्प्लेक्स प्रकारों का उपयोग कैसे करें?

इसके अलावा हमें वास्तव में एक रिपोजिटरी पैटर्न के लिए किस स्थिति में जाना चाहिए?

अग्रिम धन्यवाद

उत्तर

2

भंडार पैटर्न आपके आवेदन से अपने डेटा भंडारण तंत्र दसगुणा के लिए महत्वपूर्ण हैं। ऐसा करके आप इकाई परीक्षण के लिए इसे बहुत आसान बनाते हैं या बाद में डेटा संरचना को प्रतिस्थापित करते हैं। मेरे ब्लॉगपोस्ट को यहां कैसे/क्यों करें: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html

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

== संपादित करें == (सवाल 'क्यों 2 परतों' के जवाब में)

कारण मैं दो परतों के लिए जाने के लिए चुन लिया है, क्योंकि मेरे मन में भंडार दोनों आप कैसे के साथ क्या करना है डेटा (डेटा स्रोत परत) प्राप्त करें और आप परत कैसे पेश करते हैं (मेरे कार्यान्वयन में, शायद बुरी तरह से नामित भंडार)। आधे में कार्यान्वयन को विभाजित करके, जो भी हो, इस पर ध्यान दिए बिना कैसे रह सकता है। इसके विपरीत यदि आप यह बदलना चाहते हैं कि आप ऐसा कैसे कर सकते हैं, जबकि केवल थोड़ी देर के साथ ही शेष रहें।

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

दूसरी ओर आप डेटा को कैश करना चाहते हैं या डेटास्टोर को लिखने के प्रदर्शन पर कुछ जानकारी लॉग इन करना चाहते हैं। यह तय करना चाहिए कि कवर के तहत वास्तविक भंडारण तंत्र का उपयोग क्यों किया जाता है?

व्यक्तिगत रूप से मुझे समाधान को और अधिक लचीला बनाने के लिए इस विशेष स्थान में विभाजित पाया गया है।

+1

ईएफ पहले से ही आपके भंडारण पर एक अमूर्त नहीं है? आपको इसे फिर से लपेटने की आवश्यकता क्यों है? एक भंडार में आप वास्तव में यूनिट परीक्षण क्या करते हैं? –

+0

@EstebanAraya - आप आम तौर पर इकाई-परीक्षण भंडार नहीं करते हैं (आप उन्हें एकीकरण-परीक्षण करते हैं)। एक रिपोजिटरी इंटरफेस इंजेक्शन करके आप उस डेटाबेस से स्वतंत्र अन्य कक्षाओं (व्यावसायिक तर्क) को यूनिट-टेस्ट करने के लिए नकल कर सकते हैं। नकली आपके परीक्षणों की आवश्यकता वाले पीओसीओ के जो भी संग्रह वापस कर सकती है। – TrueWill

+0

ईएफ एक अमूर्त है जो ऑब्जेक्ट मैपिंग, इकाई/परिवर्तन ट्रैकिंग प्रदान करता है। भंडार डेटा तक पहुंचने के लिए उपयोग किए जाने वाले व्यावसायिक तर्क को लपेटता है। तर्क की तरह @ एरंगा के जवाब में वर्णित किया गया था। i.e उत्पादों को पूछताछ लेकिन बंद उत्पादों को छोड़कर। रेपॉजिटरी पैटर्न का उपयोग करके, आप सुनिश्चित करते हैं कि अंतर्निहित डेटा तक पहुंचने पर आपके व्यावसायिक नियमों का हमेशा पालन किया जाता है। – BZink

14

मुझे लगता है कि आप एक बिंदु को याद कर चुके हैं कि लोग रिपोजिटरी पैटर्न क्यों लागू करते हैं जब ईएफ ऑब्जेक्टसेट/डीबीसेट के माध्यम से पहले ही रिपोजिटरी पैटर्न लागू करता है?

लोकप्रिय उत्तर इसलिए होगा क्योंकि कई ट्यूटोरियल सलाह देते हैं कि आप इसे उचित कारणों के बिना उपयोग करें। वैध कारण हैं ऑब्जेक्टसेट/डीबीसेट पर रिपोजिटरी परत का उपयोग न करें। हालांकि मैं कुछ कारण बताऊंगा कि यह क्यों बेहतर है।

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

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 कॉलम हो सकते हैं। डेटाबेस की अखंडता को बनाए रखने के लिए आपको अन्य तालिकाओं और अनगिनत अन्य मामलों में प्रविष्टियों का डुप्लिकेट करना होगा।

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

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