MVC 控制器,这里简单描述一下其职责与功能。
回顾路由
前面(MVC路由机制)我们可以知道,当路由系统找到匹配的RouteBase对象,并返回的RouteData对象后。紧接着从RouteData中获取RouteHandler(默认为MvcRouteHandler),再从RouteHandler(MvcRouteHandler)中获取IHttphandler处理程序(MvcHandler)。
默认情况下MvcHandler将根据请求上下文(RequestContext)中的信息找到对应的控制器和活动方法,通过调用Action方法,返回应答内容,将其返回给客户端。
控制器类图
说明:
MvcHandler类通过使用单例类ControllerBuilder的GetControllerFactory方法获取当前指定的IControllerFactory对象,通过此对象来生成具体的IController控制器。对于MvcHandler来说,它只关心IController对象,即只负责调用IController的Execute方法来产生应答内容。Action方法是MVC框架默认Controller类中实现的一种机制,它通过路由信息中的action参数来确定调用Controller类中的某个对应方法,以此产生应答内容。
默认情况下,MVC框架使用DefaultControllerFactory控制器工厂,它使用路由信息中的controller参数来确定具体的控制器类,并通过反射机制生成控制器实例。
对于上面的类,我去找了一下关键的代码:
1. MvcRouteHandler返回的MvcHandler
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) {
requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
return new MvcHandler(requestContext);
}
protected virtual SessionStateBehavior GetSessionStateBehavior(RequestContext requestContext) {
string controllerName = (string)requestContext.RouteData.Values["controller"];
IControllerFactory controllerFactory = _controllerFactory ?? ControllerBuilder.Current.GetControllerFactory();
return controllerFactory.GetControllerSessionBehavior(requestContext, controllerName);
}
#region IRouteHandler Members
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext) {
return GetHttpHandler(requestContext);
}
#endregion