ASP.NET MVC: क्या नियंत्रक हर अनुरोध के लिए बनाया गया है?


112

बहुत सरल प्रश्न: क्या ASP.NET में नियंत्रक हर HTTP अनुरोध के लिए बनाए गए हैं, या वे एप्लिकेशन स्टार्टअप पर बनाए गए हैं और पूरे अनुरोधों पर पुन: उपयोग किए जाते हैं?

क्या नियंत्रक केवल एक विशेष HTTP अनुरोध के लिए बनाया जाएगा?

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


16
अपने कंस्ट्रक्टर में एक ब्रेकपॉइंट डालें और देखें कि आप क्या पता लगा सकते हैं ...
ग्रेग बी

10
@Greg B: महान विचार इसके अलावा मुझे यह नहीं बताएगा कि क्या यह हमेशा की तरह व्यवहार करता है - यदि परिस्थितियां बदलती हैं और कुछ नियंत्रक अपना व्यवहार बदल देंगे मेरे पास बग है जिसे खोजने में वास्तव में कठिन हो सकता है ...
रास्तो

@drasto अगर आप हमेशा की तरह काम करेंगे तो आप कैसे जाँचेंगे? अपने आवेदन के लिए हर अनुरोध की जाँच करें?
ग्रेग बी

4
@ टॉड स्मिथ कृपया कुछ लिंक या कम से कम पूरा नाम दें। पेड़ पत्र IoC गूगल के लिए कठिन हैं। धन्यवाद।
रास्तो

2
@drasto IoC = नियंत्रण का व्युत्क्रम en.wikipedia.org/wiki/Inversion_of_control
Bala R

जवाबों:


103

ControllerFactory(जो डिफ़ॉल्ट रूप से है DefaultControllerFactory) प्रत्येक अनुरोध के लिए एक नियंत्रक बनाया जाता है ।

http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx

ध्यान दें कि Html.Actionएचटीएमएल हेल्पर एक और नियंत्रक बनाएगा।

लघु संस्करण वह ControllerActivator.Createहै जिसे (प्रत्येक अनुरोध के लिए) एक नियंत्रक बनाने के लिए कहा जाता है (जो एक नया नियंत्रक या तो निर्भरता के माध्यम से या सक्रियकर्ता के माध्यम से सक्रिय करता है यदि कोई रिज़ॉल्वर सेट नहीं किया गया है):

public IController Create(RequestContext requestContext, Type controllerType) 
{
    try 
    {
        return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
    }

लंबा संस्करण यह है (यहाँ MvcHandler से स्रोत से कोड है):

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
    SecurityUtil.ProcessInApplicationTrust(() =>
    {
        IController controller;
        IControllerFactory factory;
        ProcessRequestInit(httpContext, out controller, out factory);

        try
        {
            controller.Execute(RequestContext);
        }
        finally
        {
            factory.ReleaseController(controller);
        }
    });
}

private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
    // non-relevant code
    // Instantiate the controller and call Execute
    factory = ControllerBuilder.GetControllerFactory();
    controller = factory.CreateController(RequestContext, controllerName);
    if (controller == null)
    {
        throw new InvalidOperationException(
            String.Format(
                CultureInfo.CurrentCulture,
                MvcResources.ControllerBuilder_FactoryReturnedNull,
                factory.GetType(),
                controllerName));
    }
}

यहाँ नियंत्रक कारखाना कोड है:

public virtual IController CreateController(RequestContext requestContext, string controllerName) 
{
    Type controllerType = GetControllerType(requestContext, controllerName);
    IController controller = GetControllerInstance(requestContext, controllerType);
    return controller;
}

जो मूल रूप से यह कहता है:

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
{
    return ControllerActivator.Create(requestContext, controllerType);
}

इस पद्धति को कौन कहता है ControllerActivator(यह कोड एक उदाहरण के लिए DependencyResolver से पूछने की कोशिश करता है, या केवल उत्प्रेरक वर्ग का उपयोग करता है):

public IController Create(RequestContext requestContext, Type controllerType) 
{
    try 
    {
        return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
    }

यह बहुत अधिक जानकारी के अंतर्गत आ सकता है ... लेकिन मैं यह दिखाना चाहता था कि आप वास्तव में अनुरोध के लिए एक नया नियंत्रक प्राप्त करेंगे।


@Daniel @drasto यहाँ प्रशस्ति पत्र aspnet.codeplex.com/SourceControl/changeset/view/63930#266503
बाला आर

32

मैंने एक कंट्रोलर के लिए एक खाली कंस्ट्रक्टर बनाया और कंस्ट्रक्टर में एक ब्रेक पॉइंट लगाया। यह हर बार एक नया अनुरोध था। इसलिए मुझे लगता है कि यह हर अनुरोध के लिए बनाया गया है।


3
+1 मैं आशा करता हूं कि आप सही हैं लेकिन मैं कुछ बेहतर अनुमोदित ज्ञान को "उन सभी मामलों में पसंद करूंगा जो मैंने कोशिश की है"। यदि कभी-कभी यह काम नहीं करता है तो किसी कारण से इसका मतलब बग है।
रास्तो

6
@ एस्ट्रो: चिंता करने की जरूरत नहीं है। हर अनुरोध के लिए नियंत्रक त्वरित हो जाता है। कुछ मेमोरी का पुन: उपयोग होता है, लेकिन आपको नियंत्रक स्थिति के बारे में चिंता नहीं करनी चाहिए (यदि आपका एक है)। उम्मीद के मुताबिक इसे शुरू किया जाएगा। लेकिन ऐसी स्थिति हो सकती है जहां एक से अधिक नियंत्रक तुरंत मिल जाएंगे। और ऐसा तब होता है जब कॉल कंट्रोलर एक्शन (यानी। Html.RenderAction("action", "controller");)
रॉबर्ट कोरिटनिक

@RobertKoritnik & Bala R, मेरा एक प्रश्न है कृपया। एक्शन मेथड के बाद इसे देखने के लिए स्टूडेंट या लिस्ट <स्टूडेंट> जैसी वस्तुओं के लिए क्या होता है? क्या उनका निस्तारण हो जाता है? और नया अनुरोध आने पर इन वस्तुओं के लिए क्या होता है?
महदी अलखतीब

3

नियंत्रक तब बनाया जाएगा जब किसी विशिष्ट नियंत्रक में कोई कार्य निष्पादित किया जाता है।

मेरे पास एक परियोजना है जहां मेरे सभी नियंत्रकों को एक ApplicationControllerऔर हर बार जब एक कार्रवाई की जाती है, तो ब्रेकपॉइंट के अंदर मारा जाता है ApplicationController- इसके " वर्तमान " नियंत्रक की परवाह किए बिना ।

जब भी मेरा नियंत्रक इस तरह बनाया जाता है, तो मैं अपने एजेंट (जो मेरे संदर्भ के रूप में काम करता है) को इनिशियलाइज़ करता हूँ:

    public IWidgetAgent widgetAgent { get; set; }

    public WidgetController()
    {
        if (widgetAgent == null)
        {
            widgetAgent = new WidgetAgent();
        }

    }

यह स्पष्ट रूप से वह नहीं है जिसकी आपको आवश्यकता है - जैसा कि आपने उल्लेख किया है कि आप केवल एक उदाहरण चाहते थे जिसे हर बार बुलाया गया था। लेकिन यह जांचने के लिए एक अच्छी जगह है कि हर बार क्या हो रहा है और यह सुनिश्चित करने के लिए कि आपके संदर्भ का एक और उदाहरण वर्तमान में मौजूद नहीं है।

उम्मीद है की यह मदद करेगा।


2

हर अनुरोध के लिए नियंत्रक बनाए जाते हैं। जादू gobal.aspx में रूटिंग में होता है। मैपिंग एमवीसी को निर्देश देती है कि किस नियंत्रक को कॉल करने के लिए नियंत्रक पर कार्रवाई करें और उन्हें पास करने के लिए पैरामीटर।

http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb


उद्धरण की आवश्यकता है - लिंक किए गए दस्तावेज़ में सहायक जानकारी नहीं मिल सकती है। धन्यवाद
Rasto
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.