且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ASP.NET MVC:为每个请求创建控制器?

更新时间: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.