2009-11-19 14 views
50

यह मेरी समझ है कि नियंत्रक के लिए कन्स्ट्रक्टर प्रत्येक वेब अनुरोध के दौरान नहीं कहा जाता है। यह मानना ​​सच है, नियंत्रक का जीवन चक्र क्या है? ऐप शुरू होने पर "निर्मित" है, फिर प्रत्येक वेब अनुरोध के साथ अनुरोध किए गए requestcontext के साथ कैश किया गया है और उसे बुलाया गया है?एएसपी.नेट एमवीसी कंट्रोलर लाइफसाइकिल

बस स्पष्ट होने के लिए, मैं कन्स्ट्रक्टर व्यवहार को अनुकरण करने के लिए नहीं कह रहा हूं, मैं उन चीजों को शुरू करने के लिए OnActionExecuting ईवेंट का उपयोग करता हूं जो मैं आमतौर पर एक कन्स्ट्रक्टर में करता हूं। इसके अलावा, मैं यूनिट और सिस्टम परीक्षण के लिए नियंत्रकों पर कन्स्ट्रक्टर का उपयोग करता हूं।

धन्यवाद!

उत्तर

74

यदि आप default controller factory का उपयोग करते हैं तो प्रत्येक अनुरोध के लिए एक नया उदाहरण बनाया जाएगा और यह वही तरीका होना चाहिए। नियंत्रकों को विभिन्न अनुरोधों के बीच साझा नहीं किया जाना चाहिए। हालांकि आप एक कस्टम फैक्ट्री लिख सकते हैं जो नियंत्रकों के जीवनकाल का प्रबंधन करता है।

+10

क्यों, हालांकि? क्यूं कर? –

+2

मैं खराब हो गया और खुद को सिखाया कि यह क्यों है और यह मामला होना चाहिए। मैं ईएफ का उपयोग कर पढ़ने/लिखने के कार्यों और विचारों के साथ नियंत्रक बना रहा था। जेनरेट कोड ने ईएफ संदर्भ उदाहरण के लिए एक निजी आवृत्ति चर बनाया। मैंने सोचा कि मैं स्मार्ट होगा और इसे एक स्थिर चर बना दूंगा। समस्या यह है कि अगर इस नियंत्रक के दायरे से बाहर कुछ डेटाबेस को संशोधित करता है, तो स्थिर संदर्भ कभी नहीं जानता है। अब मैं इसे एक आवृत्ति चर के रूप में छोड़ देता हूं और चूंकि प्रत्येक अनुरोध के साथ एक नया उदाहरण बनाया गया है, संदर्भ डेटाबेस में कोई भी परिवर्तन देख सकता है। – ThatAintWorking

+1

एक वेब एपीआई में जहां सभी राज्य पैरामीटर के भीतर निहित है (यानी एक कार्यात्मक शैली) कोई कारण नहीं है (जिसे मैं देख सकता हूं) क्यों नियंत्रक का पुन: उपयोग नहीं किया जा सकता है। यह डिजाइन द्वारा थ्रेड-सुरक्षित है। –

10

मुझे डर है, आपकी समझ गलत है। एक नियंत्रक (जो बहुत पतला और हल्का वर्ग होना चाहिए और इसमें कोई भी सत्र-बहिष्कार राज्य नहीं होना चाहिए) वास्तव में प्रत्येक वेब अनुरोध के लिए फ्लाई पर बनाया गया है। एक नियंत्रक उदाहरण एक निश्चित दृश्य के लिए विशिष्ट कैसे हो सकता है?

तो वहाँ एक "जीवन चक्र" (अनुरोध के अलावा) जैसी कोई चीज नहीं है ... हर अनुरोध के लिए आपको बस इतना

1

एक नियंत्रक बनाया जाता है। चलिए एक उदाहरण लेते हैं।

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

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

इस लिंक पर जाएं। एमवीसी नियंत्रक के जीवन चक्र पर एक अच्छी व्याख्या है।

ASP.Net MVC - Request Life Cycle

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