using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Routing; namespace Swift.MVC { public class MvcRouteHandler:IRouteHandler { public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MvcHandler(); } } }
2、MvcHandler部分的完善首先还是抛出MvcHandler.cs的源码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace Swift.MVC { public class MvcHandler : IHttpHandler { IsReusable { get { return false; } } ProcessRequest(HttpContext context) { //写入MVC的版本到HttpHeader里面 //AddVersionHeader(httpContext); //移除参数 //RemoveOptionalRoutingParameters(); routeData = context.Request.RequestContext.RouteData; controllerName = routeData.GetRequiredString(); //步骤3.得到控制器工厂 IControllerFactory factory = new SwiftControllerFactory(); //步骤4.通过默认控制器工厂得到当前请求的控制器对象 IController controller = factory.CreateController(context.Request.RequestContext, controllerName); if (controller == null) { return; } try { //步骤5.执行控制器的Action controller.Execute(context.Request.RequestContext); } catch { } finally { //步骤6.释放当前的控制器对象 factory.ReleaseController(controller); } } } }
关于上述代码,我们说明以下几点。
2.1、关于控制器工厂上述代码注释中的步骤1、2不难理解,就是从配置的路由规则中获取当前请求控制器的名称。要理解步骤3,需要先说一说MVC源码里面的控制器工厂。先来看看源码里面这段如何实现:
在源码里面的MvcHandler的ProcessRequest方法里面有这么一句: factory = ControllerBuilder.GetControllerFactory(); 。在MvcHandler里面ControllerBuilder这样定义: