2009-11-19 32 views
50

Tengo entendido que no se llama al constructor de un controlador durante cada solicitud web. Suponiendo que esto sea cierto, ¿cuál es el ciclo de vida de un controlador? ¿Se "construye" al inicio de la aplicación, luego se almacena en caché y se invoca con el texto de solicitud inyectado en cada solicitud web?Ciclo de vida del controlador ASP.NET MVC

Para que quede claro, no estoy preguntando cómo emular el comportamiento del constructor, utilizo el evento OnActionExecuting para iniciar cosas que normalmente haría en un constructor. Además, uso constructores en controladores para pruebas de unidades y sistemas.

Gracias!

Respuesta

74

Si usa el default controller factory se construirá una nueva instancia para cada solicitud y así es como debería ser. Los controladores no deben compartirse entre diferentes solicitudes. Aunque podría escribir una fábrica personalizada que gestione la vida útil de los controladores.

+10

¿Por qué? ¿Por qué? –

+2

Me equivoqué y me enseñé por qué esto es y debería ser el caso. Estaba creando controladores con acciones de lectura/escritura y vistas usando EF. El código generado creó una variable de instancia privada para la instancia de contexto de EF. Pensé que sería inteligente y convertiría eso en una variable estática. El problema es que si algo fuera del alcance de este controlador modifica la base de datos, el contexto estático nunca lo sabe. Ahora lo dejo como una variable de instancia y dado que se crea una nueva instancia con cada solicitud, el contexto puede ver cualquier cambio en la base de datos. – ThatAintWorking

+1

En una API web donde todo el estado está contenido dentro de los parámetros (es decir, un estilo funcional) no hay ninguna razón (que yo pueda ver) por qué un controlador no puede reutilizarse. Es thread-safe por diseño. –

10

Me temo que su comprensión es incorrecta. Un controlador (que debe ser una clase muy delgada y liviana y no debe tener ningún estado que viva fuera de la sesión) se construye sobre la marcha para cada solicitud web. ¿De qué otra forma podría ser una instancia de controlador específica para una determinada vista?

lo que no hay tal cosa como un "ciclo de vida" (que no sea la de la petición) ...

1

Un controlador se crea para cada solicitud que haces. Tomemos un ejemplo.

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

Ahora puede llamar al controlador desde la vista pasando un nombre de usuario. No espere obtener el userName que estableció en la siguiente solicitud. devolverá nulo. Por lo tanto, para cada solicitud se crea un nuevo controlador. No crea instancias de un controlador en ningún lugar en MVC como si instaló un objeto de una clase. Simplemente no tiene el puntero de la memoria del objeto controlador para llamarlo como lo hace con otros objetos.

Ir a este enlace. Hay una buena explicación sobre el ciclo de vida del controlador MVC.

ASP.Net MVC - Request Life Cycle

Cuestiones relacionadas