2012-08-04 10 views
5

निश्चित रूप से यह एक आम समस्या होनी चाहिए लेकिन मुझे ऐसा करने का कोई आसान तरीका नहीं मिल रहा है।Asp.net पृष्ठ जीवन चक्र-विशिष्ट वैश्विक चर?

क्या एएसपीनेट वेबफॉर्म के जीवन चक्र के माध्यम से एक वैश्विक चर (एक वर्ग जो तत्काल महंगा है) साझा करने का कोई तरीका है, पृष्ठ के प्रत्येक घटक को हैंडल पास किए बिना?

यदि मैं सिर्फ स्थिर चर बना देता हूं, तो यह ऐप डोमेन (समस्या: मेरी कक्षा थ्रेड सुरक्षित नहीं है) के सभी थ्रेडों द्वारा पहुंचा जायेगा, और यह सुनिश्चित करना मुश्किल होगा कि प्रत्येक पृष्ठ हाल की प्रतिलिपि पर काम करता है (मैं पृष्ठ के जीवन चक्र के हर चरण के माध्यम से कक्षा को कैश करना चाहता हूं, लेकिन हर बार जब कोई नया पृष्ठ बुलाया जाता है तो मैं एक नया उदाहरण चाहता हूं)।

विकल्प पृष्ठ में प्रत्येक नियंत्रण के माध्यम से एक हैंडल पास करना है, लेकिन मास्टर पेज, पृष्ठ स्वयं और सभी उपयोगकर्ता नियंत्रणों के बीच, यह कोड को काफी बालों वाला बनाता है।

मैं सोच रहा था कि किसी वर्ग में किसी स्टोर को स्टोर करने का कोई सुरुचिपूर्ण समाधान नहीं था जो केवल इस विशेष पृष्ठ को निष्पादित करने वाले थ्रेड तक पहुंच योग्य है (सभी उप उपयोगकर्ता नियंत्रण सहित)?

कोई भी सुझाव आपका स्वागत है! धन्यवाद चार्ल्स

उत्तर

7

एक साधारण उत्तर है: आइटम कंटेनर। यह एक अनुरोध के जीवनकाल के लिए उपलब्ध है और फिर यह स्वचालित रूप से नष्ट हो जाता है। आप आप क्या चाहते हैं के लिए एक संपत्ति में लपेट कर सकते हैं:

public class Foo { 

    const string SOMEKEY = "_somekey"; 

    public static string SingleRequestVariable 
    { 
     get 
     { 
      return (string)HttpContext.Current.Items[SOMEKEY]; 
     } 
     set 
     { 
      HttpContext.Current.Items.Add(SOMEKEY, value); 
     } 
    } 
} 

और फिर

Foo.SingleRequestVariable = "bar"; // somewhere 
... 
string val = Foo.SingleRequestVariable; // yet somewhere else 
+0

अच्छा समाधान! प्रभावी रूप से मेरे पास एक स्थिर फ़ंक्शन Foo.Current हो सकता है जो httpcontext में जाता है, जांचता है कि foo का उदाहरण पहले से मौजूद है, अन्यथा कोई बनाता है और इसे जोड़ता है, और यह उदाहरण देता है। शीघ्र जवाब देने के लिए ध्न्यवाद! – Charles

+0

सिर्फ इसलिए कि अन्य इस जवाब पर ठोकर खा सकते हैं ... यदि परिवर्तनीय सेट विधि में, आप HttpContext.Current.Items [SOMEKEY] = value का उपयोग करते हैं; तो यदि कोई वहां नहीं है या उसके मान को रीसेट कर देता है तो यह एक आइटम बना देगा यदि यह पहले से मौजूद है। उस शब्द को फिर से लोड करने की आवश्यकता नहीं है जब शब्दकोश वर्ग पहले से ही आपके लिए करता है। – AgapwIesu

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