Un contrôleur est créé pour chaque requête par le ControllerFactory
(qui par défaut est le DefaultControllerFactory
).
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é):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
La version plus 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 appelle essentiellement ceci:
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 au DependencyResolver une instance, 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 trop d'informations ... Mais je voulais montrer que vous obtenez vraiment un nouveau contrôleur pour CHAQUE demande.