Un contrôleur est créé pour chaque demande par le ControllerFactory
(qui par défaut est le DefaultControllerFactory
).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Notez que le Html.Action
Html Helper va créer un autre contrôleur.
La version courte est que ControllerActivator.Create
est appelé (pour chaque requête) pour créer un contrôleur (qui injecte un nouveau contrôleur soit par le DependencyResolver, soit par l'Activator si aucun Resolver n'a été mis en place) :
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
La version longue est la suivante (voici le code de la source du 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));
}
}
Voici le code d'usine du contrôleur :
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
Ce qui revient à dire que :
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
qui appelle cette méthode dans le ControllerActivator
(Ce code essaie de demander une instance au DependencyResolver, ou utilise simplement la classe Activator) :
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Cela pourrait tomber sous le coup de trop d'informations... Mais je voulais montrer que vous obtenez vraiment un nouveau contrôleur pour CHAQUE demande.