2010-03-20 13 views
6

मुझे अपने linq को sql datacontext को अपने सभी रिपोजिटरी ऑब्जेक्ट्स तक पहुंचने के लिए अपने व्यवसाय/डेटा परत में उपलब्ध होने की आवश्यकता है। हालांकि चूंकि यह एक वेब ऐप है, इसलिए मैं प्रति अनुरोध इसे बनाना और नष्ट करना चाहता हूं। मैं सोच रहा हूं कि क्या एक सिंगलटन क्लास है जो वर्तमान में HttpContext को डेटाकॉन्टेक्स्ट को आलसी बनाकर संलग्न कर सकती है। मेरा सवाल है: अनुरोध समाप्त होने पर डेटाकॉन्टेक्स्ट स्वचालित रूप से निपटान हो जाएगा? मैं जो सोच रहा हूं उसके लिए कोड नीचे है। क्या यह मेरा उद्देश्य पूरा करेगा: एक थ्रेड-सुरक्षित डेटाकॉन्टेक्स्ट उदाहरण है जो आलसी रूप से उपलब्ध है और अनुरोध समाप्त होने पर स्वचालित रूप से निपटाया जाता है? HTTP अनुरोध संदर्भ का उपयोग कर सामान स्टोर करने के लिए - - लेकिन नहीं है, डिस्पोजेबल वर्तमान HttpContext में संग्रहित वस्तुओं ऑटो जादुई जब अनुरोध समाप्त होता निपटारा नहीं किया जाएगाव्यापार स्तर में httpcontext में sql डेटाकॉन्टेक्स्ट से linq को जोड़ने के लिए

public class SingletonDC 
{ 
    public static NorthwindDataContext Default 
    { 
     get 
     { 
      NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"]; 
      if (defaultInstance == null) 
      { 
       defaultInstance = new NorthwindDataContext(); 
       System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance); 
      } 
      return defaultInstance; 
     } 
    } 
} 

उत्तर

8

क्या आप कल्पना कर समझ में आता है। आपको किसी भी तरह, खुद को संभालना होगा।

एक "एंड अनुरोध" ईवेंट है जिसे आप आसानी से हुक कर सकते हैं, उदाहरण के लिए ग्लोबल.एएसएक्स सीएस में आपके द्वारा छोड़े गए कोड का उपयोग करना। आपके Application_EndRequest() विधि में, आप सूची में प्रत्येक ऑब्जेक्ट पर मैन्युअल रूप से Dispose() पर कॉल कर सकते हैं जिसके लिए इसकी आवश्यकता होती है।

ऐसा करने का एक तरीका संदर्भ में प्रत्येक आइटम के माध्यम से फिर से चलाना है, आईडीआईएसओपेबल के लिए परीक्षण, और फिर उपयुक्त होने पर निपटान करें।

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
    foreach (var key in HttpContext.Current.Items.Keys) 
    { 
     var disposable = HttpContext.Current.Items[key] as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
      HttpContext.Current.Items[key] = null; 
     } 
    } 
} 

मुझे लगता है कि यह करना चाहिए। एएसपीएनईटी स्वचालित रूप से आपके लिए ऐसा नहीं करता है। वास्तविक कोड में इस कोड का उपयोग करने से पहले, आपको अपवादों से सुरक्षा की आवश्यकता है और इसी तरह।


कीथ सिर का चक्कर के क्रेग a relevant post on the topic a while ago लिखा था, क्या आप चीजें हैं जो बार-बार किया जाना चाहिए करने का एक तरीका दूसरे शब्दों में एक पैटर्न के रूप में करते हैं, चाहते हैं का वर्णन। वह डीबी संदर्भ को आलसी लोड करने और वर्तमान संदर्भ में छोड़ने के लिए उसमें मदद करने के लिए एक कक्षा प्रदान करता है। दृष्टिकोण के साथ कुछ नुकसान हैं - आप उस पोस्ट पर टिप्पणी चर्चा में उनके बारे में पढ़ सकते हैं। टिप्पणियों में उद्धृत संबंधित लेखों का भी एक समूह है।

3

चेसो का कोड InvalidOperationException"Collection was modified; enumeration operation may not execute" उत्पन्न करेगा क्योंकि यह HttpContext आइटम्स को संशोधित करने की कोशिश कर रहा है, जो इसे चालू कर रहा है।

आप इसे रोकने के लिए सूची की एक प्रति का उपयोग कर सकते हैं।

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
    var keys = new ArrayList(HttpContext.Current.Items.Keys); 

    foreach (var key in keys) 
    { 
     var disposable = HttpContext.Current.Items[key] as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
      HttpContext.Current.Items[key] = null; 
     } 
    } 
} 
संबंधित मुद्दे