2009-05-20 54 views
80

कंट्रोलर के कन्स्ट्रक्टर में सत्र शून्य क्यों है? इसे एक्शन विधियों से एक्सेस किया जा सकता है। संभवतः, क्योंकि एमवीसी रूटिंग फ्रेमवर्क एक नियंत्रक को नए बनाने के लिए ज़िम्मेदार है, इसने उस बिंदु पर सत्र को तुरंत चालू नहीं किया है।एएसपी.NET एमवीसी नियंत्रक कन्स्ट्रक्टर्स में सत्र शून्य,

क्या किसी को पता है कि यह डिज़ाइन द्वारा है और यदि ऐसा है, तो क्यों?

उत्तर

68

एंड्री सही है - यह शून्य है क्योंकि एएसपी.नेट एमवीसी फ्रेमवर्क के तहत चलते समय, एचटीपीकॉन्टेक्स्ट (और इसलिए एचटीपी कॉन्टेक्स्ट सत्र) सेट नहीं होता है जब नियंत्रक वर्ग का निर्माण किया जा सकता है जैसा कि आप उम्मीद कर सकते हैं, लेकिन यह सेट (" इंजेक्शन ") बाद में नियंत्रकबिल्डर वर्ग द्वारा। यदि आप जीवन चक्र की बेहतर समझ चाहते हैं तो आप या तो एएसपी.नेट एमवीसी ढांचे को खींच सकते हैं (स्रोत उपलब्ध है), या देखें: this page

यदि आपको सत्र तक पहुंचने की आवश्यकता है तो एक तरफ ओवरराइड करना होगा "OnActionExecuting" विधि और वहां पहुंचें, क्योंकि यह उस समय उपलब्ध होगा।

हालांकि, जैसा कि आंद्रेई सुझाव दे रहा है, यदि आपका कोड सत्र पर निर्भर है तो संभवतः यूनिट परीक्षण लिखना मुश्किल हो सकता है, इसलिए शायद आप एक सहायक वर्ग में सत्र को लपेटने पर विचार कर सकते हैं जिसे बाद में एक के लिए बदल दिया जा सकता है यूनिट परीक्षणों के तहत चलते समय अलग-अलग, गैर-वेब संस्करण, इसलिए वेब से अपने नियंत्रक को डी-युग्मन करना।

System.Web.HttpContext.Current.Session

मानक चेतावनी है कि इस संभावित रूप से आपके नियंत्रक के testability कम कर देता है के साथ:

+1

मुझे यकीन नहीं है कि यह HttpContext के बारे में उचित बयान है। यह वास्तव में पूरे प्रवाह की शुरुआत में सही बनाया गया। आप यहां विस्तृत प्रवाह के बारे में कुछ पढ़ सकते हैं http://www.beletsky.net/2011/06/inside-aspnet-mvc-route-to-mvchanlder.html या आप परावर्तक का उपयोग कर सकते हैं और httpContext को तत्काल स्थापित कर सकते हैं जब आप स्वयं को ढूंढ सकते हैं - fanspruntime.cs में इसकी लगभग 1556 लाइन। –

+0

@AlexeyShcherbak इसे पहले से ही बनाया जा सकता है - ओपी इस बारे में है कि यह एमवीसी नियंत्रक की सत्र संपत्ति पर सेट किया गया है या नहीं। यानी सार्वजनिक HttpSessionStateBase सत्र {प्राप्त करें; } System.Web.Mvc.Controller पर ये अलग-अलग चीजें हैं। – MemeDeveloper

10

सत्र जीवन चक्र में बाद में इंजेक्ट किया जाता है [मैं एक लेज़ी लोड हो रहा है पैटर्न का उपयोग करके समस्या को नाकाम करने में कामयाब रहे।]। वैसे भी आपको कन्स्ट्रक्टर में सत्र की आवश्यकता क्यों है? यदि आपको टीडीडी के लिए इसकी ज़रूरत है तो आपको सत्र को एक मजाकिया वस्तु में लपेटना चाहिए।

+1

आंद्रेई Rinea को जोड़ने के लिए, इस तकनीक का उसके द्वारा उल्लेख का एक विशिष्ट उदाहरण है : http://iridescence.no/post/Using-Unit-Tests-to-Ucover-Design-Flaws.aspx – murki

+4

मैं अपने रचनाकारों के दौरान सत्र का उपयोग करना चाहता हूं ताकि मुझे पहले संग्रहीत सत्र जानकारी तक पहुंच प्राप्त हो सके। हां, मैं OnActionExecuting विधि को ओवरराइड कर सकता हूं, लेकिन यह निश्चित रूप से एक सुरुचिपूर्ण समाधान नहीं है। –

+0

@ChrisArnold, मेरा जवाब देखें। –

50

अन्य उत्तर यहाँ के अलावा, जबकि Controller.Session निर्माता में तैयार नहीं हुआ है, तब भी आप सत्र के माध्यम से पहुँच सकते हैं।

+3

इन दो सत्र गुणों में से प्रत्येक के लिए प्रकार अलग है, इससे कोई फर्क नहीं पड़ता कि क्या आप सत्र स्थिति का संदर्भ रखना चाहते हैं। – BrianCooksey

+0

@ ब्रायनक्यूसी क्या अलग है? – MichaelMao

+1

नियंत्रक। सत्र सिस्टम.Web.HttpSessionStateBase प्रकार है (https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.session(v=vs.118).aspx देखें) लेकिन System.Web.HttpContext.Current.Session System.Web.SessionState.HttpSessionState प्रकार है (https://msdn.microsoft.com/en-us/library/system.web.httpcontext.session(v=vs.110 देखें) .aspx) – BrianCooksey

6

आप अपना सत्र सेट करने के लिए प्रारंभिक विधि को ओवरराइड कर सकते हैं।

protected override void Initialize(RequestContext requestContext) 
2

आप एक आईओसी कंटेनर का उपयोग कर रहे हैं, तो इंजेक्शन लगाने और Session वस्तु के स्थान पर HttpSessionStateBase प्रयोग करके देखें:

private static Container defaultContainer() 
{ 
    return new Container(ioc => 
    { 
        // session manager setup 
        ioc.For<HttpSessionStateBase>() 
           .Use(ctx => new HttpSessionStateWrapper(HttpContext.Current.Session)); 
    }); 
} 
संबंधित मुद्दे