2010-06-22 27 views
9

हमारे पास एक एएसपी.NET एमवीसी 2 वेबसाइट है, और डेटाबेस एक्सेस के लिए ईएफ 4 का उपयोग कर रही है, आदि। ईएफ 4 के लिए नया होने के नाते, हम ईएफ 4 पीओसीओ अवधारणा में आ गए हैं, हालांकि इसे पूरी तरह से समझ में नहीं आता है।ईएफ 4 में पीओसीओ का इस्तेमाल कब किया जाना चाहिए?

सामान्यतः, मैंने पीओसीओ को "बाह्य ढांचे पर निर्भर नहीं" वस्तुओं के रूप में परिभाषित किया है। ईएफ 4 के मामले में, मुझे लगता है कि इसका मतलब यह है कि पीओसीओ किसी भी तरह हल्का वजन वाली संस्थाओं का निर्माण करेगा? यदि ऐसा है, तो पीओसीओ के पास ईएफ 4 प्लंबिंग क्या नहीं है, इसके पेशेवर/विपक्ष क्या हैं, पीओसीओ के साथ अतिरिक्त विकास कार्य की आवश्यकता हो सकती है। संक्षेप में, ईएफ 4 में पीओसीओ का उपयोग करना कब अच्छा है?

उत्तर

14

"पीओसीओ" ओआरएम अंतरिक्ष में एक अस्पष्ट शब्द है। लोग इसका अर्थ यह है कि

  • "शुद्ध" पीओसीओ, जो कोई परिवर्तन ट्रैकिंग, आलसी लोडिंग, निजी गुण आदि नहीं हैं। वे काम करने के लिए चुनौतीपूर्ण हो सकते हैं।
  • Psuedo-POCO प्रॉक्सी: public virtual के साथ प्रकार और जिनके पास रनटाइम पर विभिन्न प्रकार हैं।
  • स्व-ट्रैकिंग इकाइयां। पीओसीओ नहीं, लेकिन EntityObject या तो नहीं।

मुझे "बाहरी ढांचे पर निर्भर नहीं है" परिभाषा कुछ हद तक आत्म-सेवा करने के लिए मिलती है। यह एक ढांचे की सीमाओं को अनदेखा करने का एक तरीका है। यानी, मेरी किताब में प्रॉक्सी असली पीओसीओ नहीं हैं, लेकिन वे उस परिभाषा को पूरा करते हैं।

EntityObject के साथ क्या गलत है? ज्यादा नहीं। यह काफी हल्का है, और यह .NET का हिस्सा है। यह .NET 4 क्लाइंट प्रोफाइल में भी है। यह आपको ईएफ तक भी नहीं लेता है। हालांकि यह एक अलग ढांचे के साथ "पॉको प्रकार" के रूप में उपयोग करने के लिए अजीब तरह का होगा, यह ठीक काम करेगा। यह सिल्वरलाइट में नहीं है, हालांकि, आईआईआरसी।

पीओसीओ इकाइयों के साथ काम करना कठिन होता है, क्योंकि आप EntityObject सामान को खो देते हैं जो आपको मुफ्त में देता है। यह बहुत कुछ नहीं है, लेकिन पीओसीओ को चुनने से पहले कुछ विचार करना चाहिए क्योंकि "वे शांत हैं," खासकर ईएफ के लिए नए लोगों के लिए।

एक बात यह है कि बहुत से लोग जो पीओसीओ के बारे में धार्मिक हैं उन्हें अनदेखा करते हैं: गैर-पीओसीओ प्रकारों को मैपिंग करने से आप उन गैर-पीओसीओ प्रकारों को बाहरी रूप से उजागर करने के लिए किसी भी तरह से सीमित नहीं करते हैं। आपका डाटा सेवाओं तुच्छ POCO DTOs पर गैर POCO प्रकार मैप की परियोजना सकता है और आप के लिए चुन सकते केवल उन प्रकार, यानी बेनकाब:

public IEnumerable<FooDto> IFooRepository.SelectAll() 
{ 
    return from f in Context.Foos 
      select new FooDto { Id = f.Id, Name = f.Name }; 
} 

तो मानचित्रण प्रकार और डेटा सेवा प्रकार आसानी से विभिन्न चिंताओं हो सकता है, अगर आपने ऐसा चुना ।

जब आपको पूरी तरह से मैपिंग के लिए गैर-EntityObject प्रकार की आवश्यकता होती है? खैर, अगर आपको स्वयं ट्रैकिंग इकाइयों की आवश्यकता है, तो यह एक खुला और बंद मामला है। यदि आपको सिल्वरलाइट में अपने मैप किए गए प्रकारों का खुलासा करना चाहिए, तो स्पष्ट रूप से भी।

इसके अलावा यह कम स्पष्ट है। यदि आप सार्वजनिक खपत के लिए डेटा सेवा लिख ​​रहे हैं, तो आपको डीटीओ EntityObject उपप्रकार नहीं बनाना चाहिए, क्योंकि यह बाद में एक अलग ढांचे में प्लगिंग के तरीके में खड़ा होगा। मैं कभी भी एक अपरिवर्तनीय, सार्वजनिक इंटरफेस को किसी एक ढांचे पर निर्भर नहीं करता, यहां तक ​​कि एक .NET में भी शामिल है। दूसरी ओर, जैसा कि मैंने उपरोक्त कहा है, आप एक प्रकार का पर्दाफाश कर सकते हैं और दूसरे को मानचित्र बना सकते हैं; मैप किए गए प्रकारों का खुलासा करने की कोई आवश्यकता नहीं है, कभी-कभी, और अक्सर उन्हें प्रकट न करने के बहुत अच्छे कारण (शायद वे गैर-सार्वजनिक डेटा होते हैं)।

+0

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

+4

@ कैनिबेलकोर्से: ईएफ कक्षाएं आंशिक हैं और ऑटो-जेनरेट कोड को संशोधित करने की कोई आवश्यकता नहीं है। ईएफ के साथ DataAnnotations का उपयोग करने में कोई समस्या नहीं है, आपको बस मेटाडेटा कक्षाओं का उपयोग करना होगा। – LukLed

9

मैं क्रेग के साथ पूरी तरह से सहमत हूं, पीओसीओ कुछ ऐसा करने के लिए कठिन है।

मैं पीओसीओ के उद्देश्य के बारे में और अधिक जोड़ूंगा, मुझे आशा है कि आप समझेंगे कि इसका उपयोग कब किया जाना चाहिए और इसका उपयोग कब नहीं करना चाहिए।

मॉडल और सेवा कोर है

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

यह लचीलापन के बारे में है

POCO भाषा-विशिष्ट, नहीं ढांचा विशेष की बात है। यह एक साधारण वर्ग है, जिसकी ढांचा विशिष्ट वर्ग के साथ निर्भरता नहीं है, आप माइक्रो फ्रेमवर्क और कॉम्पैक्ट फ्रेमवर्क सहित सभी .NET संस्करण में पीओसीओ का उपयोग कर सकते हैं।

यह है क्योंकि यह एक गैर इकाई परीक्षण के अनुकूल वर्ग के साथ निर्भरता नहीं है वास्तव में इकाई परीक्षण करने के लिए आसान परीक्षण

POCO बारे में है।

यह के बारे में इस तरह के रूप में मोनो बदल जाता है

अपग्रेड/डाउनग्रेड, अलग environtment में नए ग्राहक सेवा एप्लिकेशन हो? कोई समस्या नहीं होगी, आप अपनी सेवा और मॉडल का उपयोग जारी रख सकते हैं, यहां तक ​​कि सबसे खराब अपग्रेड/डाउन ग्रेड के लिए केवल व्यू और सर्विस कोटेक्स्ट हेल्पर पर ही होगा।

यह आसान और प्राकृतिक प्राकृतिक

बनाने और POCO के साथ काम करने के बारे में है आप अपने व्यापार प्रक्रिया स्पष्ट रूप से लिख सकते हैं।

लेकिन POCO याद ढांचे

मैं क्रेग के साथ सहमत के साथ अनुकूल नहीं है, POCO बहुत ठंडा नए लोगों के साथ दोस्त बनाने के लिए बहुत कूल है। डब्ल्यूपीएफ को देखो, इसे एक ऐसे मॉडल की आवश्यकता है जो INotifyPropertyChanged को कार्यान्वित करे, आप इसे प्राप्त करने के लिए क्या करते हैं? आप रैपर बना सकते हैं या आप अपने मॉडल की गतिशील प्रॉक्सी बना सकते हैं। लेकिन इसे बनाए रखने के लिए अधिक अग्रिम तकनीक और कोड की आवश्यकता होती है।

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