2010-12-10 13 views
5

मैं आईआईएस (6,7,7.5) के भीतर चल Singletons बारे में एक प्रश्न और एक ASP.NET 4.0 वेब अनुप्रयोग (MVC3 एप्लिकेशन विशिष्ट होना) है।Asp.Net वेब अनुप्रयोगों पर सिंगलटन की फिल्म चल

मैं अपने प्रोजेक्ट में एक सिंगलटन उद्देश्य यह है कि पहुँचा जा सकता है और global.ascx में इस्तेमाल किया, Application_Start पर है, साथ ही आवेदन के भीतर कुछ अन्य स्थानों पर की है।

मेरी चिंता यह है कि इस सिंगलटन को प्रति उदाहरण परिदृश्य में पहुंच योग्य होने की आवश्यकता है। हालांकि, चूंकि आईआईएस अनिवार्य रूप से होस्टिंग प्रक्रिया है, क्या सिंगलटन आवेदन के सभी उदाहरणों में एक ही वस्तु होने वाला है?

अगर मैं [ThreadStatic] कीवर्ड उपयोग करें, यह आवेदन पूल स्तर पर अलग करता है?

अंत में, वहाँ एक रास्ता है, मैं आश्वस्त कर सकते हैं एक सिंगलटन केवल अपने आवेदन के कहने के अनुसार एक सिंगलटन है। यानी यदि मैं अपना आवेदन 1 वेबसाइट पर चलाता हूं, लेकिन 5 वर्चुअल निर्देशिकाओं के अंदर, सिंगलटन के 5 उदाहरण हैं या यदि मैं एक ही एप्लिकेशन पूल में 5 अलग-अलग वेबसाइटों पर अपनी वेबसाइट चलाता हूं।

उम्मीद है कि वह पर्याप्त स्पष्ट है, बैठाना आप सिंगलटन वस्तु देखना चाहता था, मैं नीचे यह के सामान्य विचार चिपकाया।

public sealed class Singleton : IDisposable 
{ 
    [ThreadStatic] 
    private static volatile Singleton _instance; 
    [ThreadStatic] 
    private static readonly object _syncRoot = new object(); 

    public bool IsReleased { get; private set; } 

    public Singleton() 
    { 
     IsReleased = false; 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_syncRoot) 
       { 
        if (_instance == null) 
         _instance = new Singleton(); 
       } 
      } 

      return _instance; 
     } 
    } 

    public void Dispose() 
    { 
     IsReleased = true; 
     Singleton._instance = null; 
    } 
} 
+0

मैं अभी भी उलझन में हूं। क्या आप जानते हैं कि यह कैसे काम करता है या आप नहीं करते? क्या आप सवाल थोड़ा और स्पष्ट कर सकते हैं? – jcolebrand

+0

मुझे पता है कि एक सिंगलटन प्रति प्रक्रिया स्तर पर "काम करता है"। सवाल यह है कि आईआईएस इसे मेरे आवेदन के कई उदाहरणों में कैसे संभालेगा। – John

+0

जिज्ञासा से बाहर, आपका सिंगलटन डिस्पोजेबल क्यों है? क्या आप उस समय की अपेक्षा करते हैं जहां आप इसे निपटाना चाहते हैं, और फिर किसी को इसके लिए पूछने पर फिर से पुनरुत्थान करें? सही सिंगलटन आमतौर पर तब तक निपटान नहीं किए जाते जब तक कि एप्लिकेशन समाप्त नहीं हो जाता। – StriplingWarrior

उत्तर

0

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

3

स्थिर मान अपने वेब आवेदन की एक विशेष उदाहरण भर में स्थिर होना चाहिए, इसलिए अपने आवेदन के प्रत्येक उदाहरण के लिए अपने स्वयं के उदाहरण है कि उस उदाहरण पर सभी धागे में साझा किया जाएगा होगा।

आगे पढ़ने के लिए, http://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.71).aspx

ओह देखते हैं, और ThreadStatic attribute कारण केवल करने के लिए स्थिर मान एक विशेष धागा भर में स्थिर हो जाएगा, इसलिए प्रत्येक अनुरोध है कि क्षेत्र का अपना संस्करण होगा। ऐसा लगता है कि आप यही नहीं कर रहे हैं।

+1

मैं समझता हूं कि यह बहुत कम है, आईआईएस उदाहरणों को कैसे नियंत्रित करता है। चूंकि आपका एप्लिकेशन आईआईएस के नियंत्रण में चल रहा है, यह अनिवार्य रूप से नियंत्रण प्रक्रिया (w3wp.exe) है, इस प्रकार, यदि हमारे पास 5 उदाहरण चल रहे हैं तो हमें उन 5 उदाहरणों के बीच सिंगलेटन को अलग करने में समस्या है क्योंकि वे सभी w3wp.exe के अंतर्गत चल रहे हैं । – John

+0

@ जॉन: संदर्भित आलेख से, "आप एक ही प्रक्रिया में कई अनुप्रयोग डोमेन चला सकते हैं, जो अलग-अलग प्रक्रियाओं में मौजूद होगा।" तो आईआईएस की एक ही प्रक्रिया है, लेकिन यह प्रत्येक एप्लिकेशन इंस्टेंस को अपने स्वयं के एप्लिकेशन डोमेन में चलाती है, इसलिए क्लास लोडिंग जैसी चीजें संभाली जाएंगी जैसे कि प्रत्येक एप्लिकेशन एक स्टैंडअलोन ऐप था, जो दूसरों से पूरी तरह से अलग था। – StriplingWarrior

+1

तो, आप 100% सुनिश्चित हैं कि आईआईएस एक अलग एप्लिकेशन पूल के साथ एक अलग ऐप डोमेन में 5 अलग वर्चुअल निर्देशिका चलाएगा? – John

0

यदि आप पूरी तरह से यह सुनिश्चित करना चाहते हैं कि वे अलग हैं, तो आप प्रत्येक को अपने स्वयं के एप्लिकेशन पूल में चला सकते हैं। इस तरह आप प्रत्येक वर्चुअल निर्देशिका के लिए एक WP प्राप्त करेंगे।

+2

क्यों -1? क्या यह काम नहीं करता है? यदि नहीं, तो मैं अपने भविष्य के संदर्भ के बारे में जानना चाहता हूं। – Greg

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