2012-07-06 14 views
18

तो, एक ऑब्जेक्ट जो सिंगलटन पैटर्न का उपयोग करता है केवल एक उदाहरण हो सकता है। यह वेबसाइटों पर कैसे काम करता है?सिंगलटन पैटर्न वेब संदर्भ में कैसे काम करते हैं?

सवाल:

  1. सिंगलटन वेबसाइट के प्रत्येक ग्राहक/विज़िटर के लिए अद्वितीय आपत्ति है? यानी सिंगलटन ऑब्जेक्ट्स प्रति क्लाइंट एक उदाहरण प्राप्त करते हैं?
  2. वेब अनुप्रयोगों में ऑब्जेक्ट केवल कुछ सेकंड के लिए रहता है, इसलिए यदि दो क्लाइंट एक वेबसाइट तक पहुंचते हैं तो दोनों क्लाइंट सिंगलटन ऑब्जेक्ट बनाने की कोशिश करेंगे। क्या इसका मतलब है कि एक अपवाद फेंक दिया जाएगा कि आगंतुकों को देखेंगे? मैंने googling की कोशिश की, लेकिन एक सीधा जवाब नहीं मिला। मैं बस थोड़ा सा स्पष्टीकरण की तलाश में हूं।

उत्तर

7

स्टीव, मैं अपने प्रत्येक प्रश्न का उत्तर देने की कोशिश करेंगे:

1) वेब विकास के लिए वेब अनुरोध पर ऑब्जेक्ट्स रखना बहुत आम है (कभी-कभी इसे "प्रति अनुरोध संदर्भ" या "प्रति http संदर्भ" के रूप में भी जाना जाता है), लेकिन हम आम तौर पर इन्हें संदर्भित नहीं करते हैं उस सटीक कारण के लिए सिंगलेट्स। अधिकांश आईओसी कंटेनरों में वास्तव में बॉक्स के बाहर के साथ-साथ "सिंगलटन" में "प्रति वेब अनुरोध" स्कोप बनाया गया है।

2) कभी-कभी वेब एप्लिकेशन के लिए भी सही सिंगलटन होते हैं (सभी अनुरोधों तक पहुंचा)। जैसा ऊपर बताया गया है, यह पूरी तरह से सच नहीं है क्योंकि इसे ऐप पूल में स्कॉप्ड किया जा रहा है और जब ऐप पूल पुनरारंभ होता है तो उसे उड़ा दिया जाएगा। लेकिन यह वेब अनुप्रयोग के प्रयोजनों के लिए एक सिंगलटन है। जैसा कि जिगर ने उल्लेख किया है, कभी-कभी "क्रॉस-कटिंग चिंताओं" जैसे लॉगिंग इत्यादि ... इस तरह से स्थापित होते हैं। ये आम तौर पर प्रत्येक वेब अनुरोध में प्रारंभ नहीं होते हैं बल्कि इसके बजाय global.asax में या आपके लिए ऐसा करने के लिए आईओसी कंटेनर पर भरोसा करते हैं। ऑब्जेक्ट बनाने के साथ-साथ आपको केवल दो ऑब्जेक्ट्स/क्लाइंट/इत्यादि को रोकने के लिए मानक लॉकिंग पैटर्न में से किसी एक का उपयोग करने के लिए ऑब्जेक्ट सृजन निष्पादित करना होगा। यहां माइक्रोसॉफ्ट का एक लिंक है लेकिन वहां अन्य कार्यान्वयन भी हैं: http://msdn.microsoft.com/en-us/library/ff650316.aspx यदि आप लोकप्रिय आईओसी कंटेनरों में से एक का उपयोग कर रहे हैं तो यह आपके लिए इसका ख्याल रखेगा (स्ट्रक्चरमैप, विंडसर, ऑटोफैक, यूनिटी, निनजेक्ट ... और कई अन्य)।

आपको अपने सहकर्मियों से पूछना होगा कि वे किस दृष्टिकोण से बात कर रहे हैं क्योंकि दोनों कुछ स्थितियों में मान्य हैं और बहुत आम हैं।

1

सिंगलटन आईआईएस द्वारा बनाए रखा जाता है, इसलिए सिंगलटन केवल आईआईएस आवेदन पूल के रूप में रहता है। एक बार यह पुनर्नवीनीकरण हो जाता है या आईआईएस रीसेट हो जाता है तो सिंगलटन गायब हो जाता है। आपको सिंगलटन को एकाधिक एक्सेस के लिए लॉक करना होगा। जैसा कि आप किसी अन्य क्लाइंट सर्वर ऐप में करेंगे।

आम तौर पर मैं इसे टालने की कोशिश करता हूं क्योंकि यह एक वेबसाइट के विचार के खिलाफ अनिवार्य रूप से एक स्टेटलेस क्लाइंट सर्वर ऐप है। किसी भी साझा डेटा को स्टोर करने के लिए सत्र का उपयोग क्यों न करें?

+0

मैंने वेब विभाग में एक कंपनी में इंटर्नशिप शुरू की, और मैंने अपने कुछ सहकर्मियों को वेब संदर्भ में सिंगलेट के बारे में बात करते हुए सुना और मैं परेशान था। यह ऐसा कुछ नहीं है जिसे मैं वर्तमान में कार्यान्वित कर रहा हूं। –

+0

साझा डेटा स्टोर करने के लिए कोई सत्र का उपयोग कैसे करता है? – Tarynn

1

लॉगर और साझा संसाधनों के लिए हम निश्चित रूप से वेब ऐप्स में सिंगलटन का उपयोग कर सकते हैं .. और जैसा कि लिआम ने उल्लेख किया है कि वे तब तक रहते हैं जब तक आपका एप्लिकेशन पूल साफ़ नहीं होता है।

बेहतर समझ यात्रा के लिए ... http: //www.oodesign.com/singleton-pattern.html

धन्यवाद

+0

एक पूर्ण उत्तर की तरह नहीं दिखता है। टिप्पणी के रूप में बेहतर हो सकता है – codingbiz

+0

बहुत खराब जवाब। –

+0

नीचे वोट :(खैर पूरा जवाब और कोई स्वीकार नहीं हो सकता है लेकिन जो व्यक्ति को उठाया गया है सवाल कह सकते हैं कि एक पूरा या अधूरा जवाब है। गंभीर हालांकि –

2

यह सब आपके सिंगलटन कार्यान्वयन पर निर्भर करता है। यहां मैं मानता हूं कि आप स्थिर रचनाकारों में प्रारंभिक स्थिर फ़ील्ड के रूप में सिंगलेट बनाते हैं।

सैद्धांतिक रूप से अपनी सेटिंग के आधार पर आईआईएस आपके आवेदन के लिए कई प्रक्रियाओं बना सकते हैं, और प्रत्येक प्रक्रिया प्रसंस्करण अनुरोधों के लिए कई सूत्र बना सकते हैं। प्रत्येक प्रक्रिया में अपने स्वयं के सिंगलेट होंगे, जिन्हें कई धागे (और कई अनुरोध) साझा किया जा सकता है। लेकिन एक ही समय में एक ही सर्वर पर "एकमात्र" (प्रत्येक प्रक्रिया के लिए एक) के कई उदाहरण हो सकता है (लेकिन, अगर मैं सही ढंग से समझ, कई प्रक्रियाओं आईआईएस सेटिंग्स में प्रतिबंधित किया जा सकता है)।

आप स्थिर कंस्ट्रक्टर्स उपयोग करते हैं, तो एकमात्र एक धागा सुरक्षित तरीके से अपने वर्ग के लिए सबसे पहले पहुंच पर निर्मित किया जाएगा। Is the C# static constructor thread safe?

लेकिन हालांकि सिंगलटन निर्माण थ्रेड-सुरक्षित है, फिर भी आपको अपने सिंगलटन क्लास के अंदर थ्रेड-सुरक्षित तरीके से लागू करना होगा।

Singletons रहते हुए अपने आवेदन प्रक्रिया रहता है और पुन: प्रारंभ नहीं किया गया है जाएगा। आजीवन आवेदन प्रक्रिया आईआईएस द्वारा प्रबंधित की जाती है, इसलिए यह एक लंबा समय या बहुत ही कम समय हो सकता है।

-1
public class SingletonContext<TContext> 
    where TContext: DbContext,new() 
{ 
    private static TContext _context; 

    private SingletonContext() 
    { 

    } 
    public static TContext GetInstance() 
    { 
     if (_context == null) 
     { 
      _context = new TContext(); 
     } 
     return _context; 
    } 

} 
+0

जरूरत हां, तो दो बातें। 1) नहीं किया जा सका कोई सिर्फ 'नया MyDbContext() '? यह दो को रोकता नहीं है। और 2) मुझे लगता है कि आप यह कर रहे हैं क्योंकि आप 'समान संदर्भों की एक गुच्छा अप new' नहीं करना चाहते हैं, लेकिन यह सबसे अच्छा आपके आईओसी कंटेनर में हैंडल किया जाएगा –

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

  • कोई संबंधित समस्या नहीं^_^