Pergunta muito simples: os controladores no ASP.NET são criados para cada solicitação HTTP ou são criados na inicialização do aplicativo e reutilizados em todas as solicitações?
O controlador será criado apenas para uma solicitação HTTP específica?
Se minhas suposições anteriores estiverem corretas, posso confiar nisso? Quero criar um contexto de banco de dados (Entity Framework) que viverá apenas para uma solicitação. Se eu criá-lo como uma propriedade inicializada no construtor do controlador, será permitido que uma nova instância de contexto seja criada para cada solicitação?
Respostas:
Um controlador é criado para cada solicitação do
ControllerFactory
(que por padrão é oDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Observe que o
Html.Action
Html Helper criará outro controlador.A versão resumida é que
ControllerActivator.Create
é chamado (para cada solicitação) para criar um Controlador (que inicia um novo Controlador através do DependencyResolver ou através do Ativador se nenhum Resolver tiver sido configurado):A versão mais longa é esta (aqui está o código da fonte do MvcHandler):
Este é o código de fábrica do controlador:
O que basicamente chama isso de:
Que chama este método no
ControllerActivator
(Este código tenta solicitar uma instância ao DependencyResolver ou apenas usa a classe Activator):Isso pode envolver muita informação ... Mas eu queria mostrar que você realmente TEM um novo controlador para CADA solicitação.
fonte
Eu criei um construtor vazio para um controlador e coloquei um ponto de interrupção no construtor. Ele era atingido toda vez que havia um novo pedido. Acho que é criado para cada solicitação.
fonte
Html.RenderAction("action", "controller");
O controlador será criado quando qualquer ação em um controlador específico for executada.
Eu tenho um projeto onde todos os meus controladores herdam de um
ApplicationController
e sempre que uma ação é executada, o ponto de interrupção é atingido dentro doApplicationController
- independentemente de seu controlador " atual ".Eu inicializo meu agente (que funciona como meu contexto) sempre que meu controlador é criado assim:
Obviamente, isso não é o que você precisa - como você mencionou, só queria uma única instância cada vez que fosse chamada. Mas é um bom lugar para verificar o que está acontecendo a cada vez e garantir que outra instância do seu contexto não exista no momento.
Espero que isto ajude.
fonte
Controladores são criados para cada solicitação. A mágica acontece no roteamento no gobal.aspx. Os caminhos de mapeamento direcionam MVC para qual controlador criar e ação no controlador para chamar e parâmetros para passar para eles.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
fonte