Un controlador está creado para cada solicitud por el ControllerFactory (que por defecto es el DefaultControllerFactory).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Tenga en cuenta que la Html.Action
HTML ayudante creará otro controlador.
La versión corta es que ControllerActivator.Create
se llama (para cada solicitud) para crear un controlador (que INITs un nuevo controlador, ya sea a través de la DependencyResolver oa través del Activador si no hay Resolver se ha establecido):
public IController Create(RequestContext requestContext, Type controllerType) {
try {
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
la versión más larga es la siguiente (Aquí está el código de la fuente desde el 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));
}
}
Aquí está el código de fábrica controlador
public virtual IController CreateController(RequestContext requestContext, string controllerName) {
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
que se pide básicamente esto:
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
return ControllerActivator.Create(requestContext, controllerType);
}
que llama a este método en el ControllerActivator (Este código intenta pedir al DependencyResolver para una instancia, o simplemente utiliza la clase Activador):
public IController Create(RequestContext requestContext, Type controllerType) {
try {
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Esto podría caer en Demasiada información ... Pero quería mostrar que realmente OBTIENE un nuevo controlador para CADA petición.
Ponga un punto de interrupción en su constructor y vea lo que puede encontrar ... –
@Greg B: gran idea, excepto que no me dirá si se comporta así siempre - si las circunstancias cambian y algún controlador cambiará su comportamiento I tiene un error que puede ser muy difícil de encontrar ... – drasto
@drasto ¿cómo va a comprobar si funciona así siempre? Compruebe cada solicitud a su aplicación? –