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));
}
यह बहुत अधिक जानकारी के अंतर्गत आ सकता है ... लेकिन मैं यह दिखाना चाहता था कि आप वास्तव में अनुरोध के लिए एक नया नियंत्रक प्राप्त करेंगे।