2009-02-06 11 views
18

मैं एक नई परियोजना शुरू कर रहा हूं और डीडीडी पैटर्न को शामिल करने का प्रयास करने का निर्णय लिया है और इसमें लिंक से संस्थाएं भी शामिल हैं। जब मैं ईएफ के ऑब्जेक्ट कॉन्टेक्स्ट को देखता हूं तो यह दोनों रिपोजिटरी और वर्क पैटर्न के यूनिट के कार्यों को निष्पादित करता प्रतीत होता है:रिपोजिटरी और यूनिटऑफवर्क के रूप में इकाई फ्रेमवर्क?

इस अर्थ में रेस्पोजिटरी कि अंतर्निहित डेटा स्तर इंटरफ़ेस इकाई प्रतिनिधित्व से सारणीबद्ध है और मैं डेटा का अनुरोध और सहेज सकता हूं ऑब्जेक्ट कॉन्टेक्स्ट के माध्यम से।

इस काम में यूनिट का अर्थ है कि मैं ऑब्जेक्ट को अपने सभी आवेषण/अपडेट लिख सकता हूं और जब मैं SaveChanges() करता हूं तो उन्हें एक शॉट में निष्पादित करता हूं।

ईएफ ऑब्जेक्ट कॉन्टेक्स्ट के शीर्ष पर इन पैटर्न की एक और परत डालने के लिए अनावश्यक लगता है? ऐसा लगता है कि मॉडल वर्गों को 'आंशिक वर्ग' का उपयोग करके ईएफ जेनरेट की गई इकाइयों के शीर्ष पर सीधे शामिल किया जा सकता है।

मैं डीडीडी में नया हूं इसलिए कृपया मुझे बताएं कि मुझे यहां कुछ याद आ रहा है।

उत्तर

17

मुझे नहीं लगता कि इकाई की रूपरेखा, भंडार का एक अच्छा कार्यान्वयन है क्योंकि:

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

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

+2

धन्यवाद क्रेग। मैं साइमन सेगल द्वारा http://www.simonsegal.net/blog/2009/01/13/entity-framework-repository- स्पेसिफिकेशंस-and-fetching-strategies/ पर एक ब्लॉग में कुछ कोड आया था जो कुछ नमूना रिपोजिटरी कार्यान्वयन प्रदान करता है इकाई फ्रेमवर्क के लिए। – Weej

+0

क्या आप वर्तमान में अपने डिज़ाइन में EntityFramework का उपयोग कर रहे हैं? कार्यान्वयन में कोई कठिनाई है? धन्यवाद फिर से – Weej

+0

हां, हम इकाई फ्रेमवर्क का उपयोग कर रहे हैं। आसपास के रिपोजिटरी को लागू करने में कोई कठिनाई नहीं है; तुच्छ है हमारे पास इकाई फ्रेमवर्क के साथ सभी प्रकार की कठिनाइयां हैं; मुझे लगता है कि यह किसी भी ओआरएम के लिए शायद सच है। –

7

मैं कहूंगा कि आपको ऑब्जेक्ट कॉन्टेक्स्ट को अपने यूनिटऑफवर्क के रूप में देखना चाहिए, न कि एक भंडार के रूप में।

एक ऑब्जेक्ट कॉन्टेक्स्ट एक भंडार नहीं हो सकता है- क्योंकि यह 'जेनेरिक' है। आपको अपनी खुद की रेपॉजिटरीज़ बनाना चाहिए, जिसमें नियमित सीआरयूडी विधियों के बगल में विशेष तरीकों (जैसे उदाहरण के लिए GetCustomersWithGoldStatus) हैं।

तो, मैं क्या करूंगा, रिपॉजिटरीज़ (प्रत्येक समग्र रूट के लिए एक) बना रहा है, और उन रिपॉजिटरीज ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग करने दें।

एफई पकड़ लिया स्पष्ट नहीं है

आप एफई (कोड प्रथम संस्करण) पर वर्तमान ट्यूटोरियल से कुछ पर नजर है, यह है एक:

+0

फ्रेडरिक टिप्पणी के लिए धन्यवाद। क्या आप सीधे Reository में GetCustomersWithGoldStatus लागू करेंगे? क्या आपने एक्सटेंशन विधियों का उपयोग करने पर विचार किया है? क्या आपको लगता है कि इस परिदृश्य में एक्सटेंशन विधियों का स्थान है? – Weej

+0

आप किस प्रकार की एक्सटेंशन विधि बनायेंगे? मैं वास्तव में इसे भंडार पर बनाऊंगा, लेकिन विस्तार विधि के रूप में नहीं। भंडार को 'संग्रह' के रूप में माना जा सकता है जहां से आप संस्थाएं प्राप्त करते हैं, इसलिए मुझे लगता है कि यह इस तरह से करने के लिए एक वैध जगह है –

0

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

डेटा का उपयोग तंत्र

एक भंडार की एक साफ तस्वीर कैसे बीएल पहुँचने और डेटा संग्रह अद्यतन किया जाता है के रूप में एक विशिष्ट तस्वीर देता है। यह उन तरीकों का खुलासा करता है जिनके पास एक स्पष्ट उद्देश्य है, और बीएल के स्वतंत्र रूप से परीक्षण किया जा सकता है। पाठ्यपुस्तकों से मानक उदाहरण, एक इकाई खोजने के लिए() खोजें। एक और अनुप्रयोग विशिष्ट उदाहरण, एक डीबी तालिका को साफ़ करने के लिए साफ़ करें()

अनुकूलन

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

उदाहरण हैं,

GetKeys() (सम्मिलित करें/अद्यतन निर्णय के लिए) टेबल से कैश की गई कुंजी प्रदर्शित करता है। कुंजी का पठन केवल तेज़ है और पूर्ण इकाई को पढ़ने से कम स्मृति का उपयोग करता है।

एसक्यूएलकल्क कॉपी के माध्यम से थोक भार। ईएफ व्यक्तिगत एसक्यूएल स्टेटमेंट्स द्वारा डाला जाएगा। यदि आप एकाधिक पंक्तियों को सम्मिलित करने के लिए एक कथन चाहते हैं, तो SQLBulkCopy एक अच्छी तंत्र है। भंडार यह encapsulates और SqlBulkCopy के लिए मेटाडेटा प्रदान करता है। साथ ही सम्मिलित विधि, आपको स्टार्टबैच() और एंडबैच() विधि की आवश्यकता है, जो यूनिटऑफवर्क परत के लिए भी एक तर्क है।