Question très simple: les contrôleurs dans ASP.NET sont-ils créés pour chaque requête HTTP ou sont-ils créés au démarrage de l'application et réutilisés tout au long des requêtes?
Le contrôleur sera-t-il créé uniquement pour une requête HTTP particulière?
Si mes hypothèses précédentes sont correctes, puis-je m'en remettre? Je souhaite créer un contexte de base de données (Entity Framework) qui ne vivra que pour une seule demande. Si je le crée en tant que propriété initialisée dans le constructeur du contrôleur, est-il autorisé qu'une nouvelle instance de contexte soit créée pour chaque demande?
Réponses:
Un contrôleur est créé pour chaque requête par le
ControllerFactory
(qui par défaut est leDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Notez que
Html.Action
Html Helper créera un autre contrôleur.La version courte
ControllerActivator.Create
est appelée (pour chaque requête) pour créer un contrôleur (qui entre dans un nouveau contrôleur soit via le DependencyResolver, soit via l'activateur si aucun résolveur n'a été configuré):La version plus longue est la suivante (voici le code de la source du MvcHandler):
Voici le code d'usine du contrôleur:
Ce qui appelle essentiellement ceci:
Qui appelle cette méthode dans le
ControllerActivator
(Ce code essaie de demander au DependencyResolver une instance, ou utilise simplement la classe Activator):Cela pourrait tomber sous trop d'informations ... Mais je voulais montrer que vous obtenez vraiment un nouveau contrôleur pour CHAQUE demande.
la source
J'ai créé un constructeur vide pour un contrôleur et mis un point d'arrêt dans le constructeur. Il était touché à chaque fois qu'il y avait une nouvelle demande. Je pense donc qu'il est créé pour chaque demande.
la source
Html.RenderAction("action", "controller");
)Le contrôleur sera créé lorsqu'une action dans un contrôleur spécifique est effectuée.
J'ai un projet où tous mes contrôleurs héritent d'un
ApplicationController
et chaque fois qu'une action est effectuée, le point d'arrêt est atteint à l'intérieur duApplicationController
- quel que soit son contrôleur " actuel ".J'initialise mon agent (qui fonctionne comme mon contexte) chaque fois que mon contrôleur est créé comme tel:
Ce n'est évidemment pas ce dont vous avez besoin - comme vous l'avez mentionné, vous ne vouliez qu'une seule instance à chaque fois qu'elle était appelée. Mais c'est un bon endroit pour vérifier ce qui se passe à chaque fois et pour s'assurer qu'une autre instance de votre contexte n'existe pas actuellement.
J'espère que cela t'aides.
la source
Des contrôleurs sont créés pour chaque demande. La magie se produit dans le routage dans le gobal.aspx. Les chemins de mappage dirigent MVC vers le contrôleur à créer et l'action sur le contrôleur à appeler, ainsi que les paramètres à leur transmettre.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
la source