回到MvcHandler的 ProcessRequest , DefaultControllerFactory.CreateController(RequestContext, requiredString) 来返回 IController 实例。下面看看 DefaultControllerFactory的代码:
通过反射来创建 Controller 实例 ,GetControllerType 里面做了些缓存处理,以此来避免频繁使用反射造成的性 能问题。继续
MvcHandler.ProcessRequest(),在得到控制器实例后, MvcHandler 开始了调用 Controller.Execute() 来进一步后续操作,同时对其上 下文进一步封装,除了前面创建的 RequestContext,还加上了当前这个 Controller 对象的引用,类名叫ControllerContext。
namespace System.Web.Mvc {
using System.Web.Routing;
[AspNetHostingPermission (System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission (System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ControllerContext : RequestContext {
public ControllerContext(HttpContextBase httpContext, RouteData routeData, IController controller)
: base(httpContext, routeData) {
if (controller == null) {
throw new ArgumentNullException("controller");
}
Controller = controller;
}
public ControllerContext(RequestContext requestContext, IController controller)
: this(GetRequestContext (requestContext).HttpContext, GetRequestContext (requestContext).RouteData, controller) {
}
public IController Controller {
get;
private set;
}
internal static RequestContext GetRequestContext(RequestContext requestContext) {
if (requestContext == null) {
throw new ArgumentNullException("requestContext");
}
return requestContext;
}
}
}