Pregunta muy simple: ¿Se crean controladores en ASP.NET para cada solicitud HTTP, o se crean al inicio de la aplicación y se reutilizan en todas las solicitudes?
¿Se creará el controlador solo para una solicitud HTTP en particular?
Si mis suposiciones anteriores son correctas, ¿puedo confiar en ello? Quiero crear un contexto de base de datos (Entity Framework) que vivirá solo para una solicitud. Si lo creo como una propiedad inicializada en el constructor del controlador, ¿se concede que se creará una nueva instancia de contexto para cada solicitud?
Respuestas:
El controlador crea un controlador para cada solicitud
ControllerFactory
(que de forma predeterminada es elDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Tenga en cuenta que
Html.Action
Html Helper creará otro controlador.La versión corta es la que
ControllerActivator.Create
se llama (para cada solicitud) para crear un controlador (que inicia un nuevo controlador, ya sea a través del DependencyResolver o mediante el Activator si no se ha configurado ningún Resolver):La versión más larga es esta (aquí está el código de la fuente del MvcHandler):
Aquí está el código de fábrica del controlador:
Que básicamente llama a esto:
Que llama a este método en el
ControllerActivator
(Este código intenta pedirle al DependencyResolver una instancia, o simplemente usa la clase Activator):Esto podría incluir demasiada información ... Pero quería mostrar que realmente SÍ obtienes un nuevo controlador para CADA solicitud.
fuente
Creé un constructor vacío para un controlador y puse un punto de interrupción en el constructor. Recibía un impacto cada vez que había una nueva solicitud. Entonces creo que está creado para cada solicitud.
fuente
Html.RenderAction("action", "controller");
)El controlador se creará cuando se realice cualquier acción en un controlador específico.
Tengo un proyecto en el que todos mis controladores heredan de un
ApplicationController
y cada vez que se realiza una acción, el punto de interrupción se alcanza dentro delApplicationController
- independientemente de su controlador " actual ".Inicializo mi agente (que funciona como mi contexto) cada vez que mi controlador se crea así:
Obviamente, esto no es lo que necesita, como mencionó que solo quería una instancia única cada vez que se llamaba. Pero es un buen lugar para verificar lo que sucede cada vez y para asegurarse de que no exista otra instancia de su contexto actualmente.
Espero que esto ayude.
fuente
Los controladores se crean para cada solicitud. La magia ocurre en el enrutamiento en gobal.aspx. Las rutas de mapeo dirigen MVC a qué controlador crear y actuar en el controlador para llamar, y los parámetros para pasarles.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
fuente