Kontroler dibuat untuk setiap permintaan oleh ControllerFactory
(yang secara default adalah DefaultControllerFactory
).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Perhatikan bahwa Html.Action
Pembantu Html akan membuat pengontrol lain.
Versi singkatnya adalah yang ControllerActivator.Create
disebut (untuk setiap permintaan) untuk membuat Controller (yang menginisi Controller baru baik melalui DependencyResolver atau melalui Activator jika tidak ada Resolver yang telah diatur):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Versi yang lebih panjang adalah ini (Berikut kode dari sumber dari 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));
}
}
Berikut kode pabrik Controller:
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
Yang pada dasarnya menyebut ini:
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
Yang memanggil metode ini di ControllerActivator
(Kode ini mencoba meminta DependencyResolver untuk sebuah instance, atau hanya menggunakan kelas Activator):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Ini mungkin berada di bawah terlalu banyak informasi ... Tapi saya ingin menunjukkan bahwa Anda benar-benar DO mendapatkan pengontrol baru untuk SETIAP permintaan.