2010-04-27 9 views
13

मैं अब एफई सीख रहा हूँ और ObjectContext से संबंधित प्रश्न है: जब मैं डेटाबेस का उपयोगइकाई की रूपरेखा ObjectContext फिर से उपयोग

मैं हर क्वेरी (समारोह) के लिए ObjectContext के कहने बनाना चाहिए?

या इसे एक बार (सिंगलटन) बनाने और इसे पुन: उपयोग करने के लिए बेहतर है?

एफई इससे पहले कि मैं उद्यम पुस्तकालय डेटा का उपयोग ब्लॉक का उपयोग किया गया था और DataAccess समारोह के लिए dataacess का उदाहरण बनाया ...

निश्चित रूप से प्रत्येक क्वेरी के लिए
+0

IMO - उपयोग डि एफई वस्तु संदर्भ के कहने को हल और कौन-सा विकल्प सबसे अच्छा परिणाम देता है की जाँच करने के जीवन काल के साथ चारों ओर खेलने के लिए ... – Sunny

उत्तर

14

। यह एक हल्का वस्तु है इसलिए हर बार आपको इसकी आवश्यकता होने पर बहुत अधिक लागत नहीं होती है।

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

और फिर एक रखरखाव मुद्दा है। एक दिन आप एक बग को ट्रैक करने का प्रयास करते हैं लेकिन यह पता नहीं लगा सकता कि डेटा लोड किया गया था जिसके कारण यह हुआ।

+3

मैं इस जवाब से सहमत हैं तो केवल विकल्प थे सिंगलटन और ऑन-एक्सेस। लेकिन जीवनकाल का एक संपूर्ण स्पेक्ट्रम है, जिनमें से कुछ आवेदन के आधार पर बेहतर प्रदर्शन दे सकते हैं। एक कारण के लिए संदर्भ कैश :) प्रति-अनुरोध ऑन-एक्सेस के बगल में गुच्छा का "सबसे सुरक्षित" है। –

1

एक सिंगलटन का उपयोग न करें .. आपके ऐप का उपयोग करने वाले प्रत्येक व्यक्ति इसे साझा करेगा और उस ऑब्जेक्ट संदर्भ में इकाइयों को ट्रैक करने पर पागल चीजें सभी प्रकार की होंगी।

मैं एक निजी सदस्य

+0

मेरा मतलब है सिंगलटन प्रति सत्र (प्रत्येक उपयोगकर्ता को यह स्वयं मिल जाता है), और मैं ट्रैकिंग – verror

+0

ट्रैकिंग को अक्षम करने की योजना बना रहा हूं, मैं rwwilden की पहली प्रतिक्रिया से सहमत हूं। –

15

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

public class MyEntitiesHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += ApplicationBeginRequest; 
     application.EndRequest += ApplicationEndRequest; 
    } 

    private void ApplicationEndRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Items[@"MyEntities"] != null) 
      ((MyEntities)HttpContext.Current.Items[@"MyEntities"]).Dispose(); 
    } 

    private static void ApplicationBeginRequest(Object source, EventArgs e) 
    { 
     var context = new MyEntities(); 
     HttpContext.Current.Items[@"MyEntities"] = context; 
    } 
} 
+1

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

+1

@rwwilden: क्षमा करें, लेकिन यह यूआई और डेटा परत के बीच निर्भरता कैसे बनाता है? मैं भंडार पैटर्न का उपयोग कर रहा हूं और भंडारों को संदर्भ साझा करना है। संदर्भ डी कंटेनर द्वारा इंजेक्शन दिया जाता है। अनुरोध इतना लंबा नहीं है और इसमें इतने सारे ऑपरेशन नहीं हैं जो इतनी सारी समस्याएं पैदा कर सकते हैं। यदि आप उचित पैटर्न का उपयोग करते हैं, तो आपको कोई समस्या नहीं होगी। – LukLed

+1

@rwwilden: ऑब्जेक्ट कॉन्टेक्स्ट पुन: उपयोग के बारे में लाखों प्रश्न थे, यहां SO और अन्य पृष्ठों पर। प्रति अनुरोध उपयोग पर हावी होने लगता है, यह केवल मेरी राय नहीं है। निर्भरता के बारे में – LukLed

1

ल्यूक की तरह कहते हैं कि इस प्रश्न को SO पर कई बार पूछा गया है।

वेब एप्लिकेशन के लिए, प्रति अनुरोध चक्र सबसे अच्छा काम करता प्रतीत होता है। सिंगलटन निश्चित रूप से एक बुरा विचार है।

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

+1

स्टेटिक सिंगलटन न केवल एक बुरा विचार है, यह भी गैर थ्रेड सुरक्षित है! एक निर्मित संदर्भ केवल एक धागे में इस्तेमाल किया जाना चाहिए। –

0

यहां 7 महीने तक देर से पोस्ट करें। मैं वर्तमान में अपने ऐप में इस सवाल का सामना कर रहा हूं और मैं अपने एचटीपीआरक्वैस्ट की अवधि के लिए सिंगलटन ऑब्जेक्ट कॉन्टेक्स्ट बनाकर @ लुकलेड समाधान की ओर झुका रहा हूं। मेरे आर्किटेक्चर के लिए, मेरे पास कई नियंत्रण हैं जो एक पृष्ठ बनाने में जाते हैं और इन नियंत्रणों में सभी की अपनी डेटा चिंताएं होती हैं जो ईएफ परत से केवल पढ़ने के लिए डेटा खींचती हैं। उनके लिए प्रत्येक को बनाने और अपने ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग करने के लिए यह अपर्याप्त लगता है। इसके अलावा, ऐसी कुछ स्थितियां हैं जहां एक नियंत्रण डेटा को संदर्भ में खींच सकता है जिसे अन्य नियंत्रणों द्वारा पुन: उपयोग किया जा सकता है। उदाहरण के लिए, मेरे मास्टरपेज में, पृष्ठ के शीर्ष पर मेरे शीर्षलेख में उपयोगकर्ता की जानकारी होती है जिसे पृष्ठ पर अन्य नियंत्रणों द्वारा पुन: उपयोग किया जा सकता है।

मेरी एकमात्र चिंता यह है कि मैं संस्थाओं को संदर्भ में खींच सकता हूं जो अन्य नियंत्रणों के प्रश्नों को प्रभावित करेगा। मैंने अभी तक यह नहीं देखा है लेकिन मुझे नहीं पता कि मैं परेशानी के लिए पूछ रहा हूं या नहीं। मुझे लगता है हम देखेंगे!

0
public class DBModel { 

     private const string _PREFIX = "ObjectContext"; 

     // DBModel.GetInstance<EntityObject>(); 
     public static ObjectContext GetInstance<T>() { 
      var key = CreateKey<T>(); 
      HttpContext.Current.Items[key] = HttpContext.Current.Items[key] ?? Activator.CreateInstance<T>(); 
      return HttpContext.Current.Items[key] as ObjectContext; 
     } 

     private static string CreateKey<T>() { 
      return string.Format("{0}_{1}", _PREFIX, typeof(T).Name); 
     } 
    } 
संबंधित मुद्दे