Für jede Anforderung wird ein Controller erstellt ControllerFactory
(der standardmäßig der ist DefaultControllerFactory
).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Beachten Sie, dass der Html.Action
HTML-Helper einen anderen Controller erstellt.
Die Kurzversion ControllerActivator.Create
wird aufgerufen (für jede Anforderung), um einen Controller zu erstellen (der einen neuen Controller entweder über den DependencyResolver oder über den Activator einleitet, wenn kein Resolver eingerichtet wurde):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Die längere Version ist folgende (Hier ist der Code aus der Quelle des 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));
}
}
Hier ist der Controller-Werkscode:
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
Was im Grunde so heißt:
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
Welche ruft diese Methode in der ControllerActivator
(Dieser Code versucht, den DependencyResolver nach einer Instanz zu fragen, oder verwendet nur die Activator-Klasse):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Dies könnte unter zu viele Informationen fallen ... Aber ich wollte zeigen, dass Sie wirklich für JEDE Anfrage einen neuen Controller bekommen.