更新时间:2023-02-25 16:28:13
一个控制器是由的ControllerFactory(默认情况下是DefaultControllerFactory)每个请求创建。
A Controller is created for every request by the ControllerFactory (which by default is the DefaultControllerFactory).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
注意 Html.Action
HTML辅助将创造另一个控制器。
Note that the Html.Action
Html Helper will create another controller.
短的版本是, ControllerActivator.Create
被称为(为每个请求)来创建一个控制器(inits一个新的控制器或者通过DependencyResolver或通过激活,如果无变压器已设置):
The short version is that ControllerActivator.Create
is called (for every request) to create a Controller (Which inits a new Controller either through the DependencyResolver or through the Activator if no Resolver has been set up):
public IController Create(RequestContext requestContext, Type controllerType) {
try {
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
在更长的版本是这样的(这里是从源头从MvcHandler的code)
The longer version is this (Here's the code from the source From the 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));
}
}
下面是控制器出厂code
Here's the Controller factory code
public virtual IController CreateController(RequestContext requestContext, string controllerName) {
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
这基本上要求是:
Which basically calls this :
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
return ControllerActivator.Create(requestContext, controllerType);
}
调用该方法在ControllerActivator(这code试图询问DependencyResolver一个实例,或者只是使用Activator类):
Which calls this method in the ControllerActivator (This code tries to ask the DependencyResolver for an instance, or just uses the Activator class):
public IController Create(RequestContext requestContext, Type controllerType) {
try {
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
这可能属于信息太多...但我想证明你真的得到为每个请求一个新的控制器。
This might fall under Too much information... But I wanted to show that you really DO get a new controller for EVERY request.