看到这里应该知道上文中 SwiftRouteTable 、 SwiftRouteCollection 、 SwiftRoute 三个类的用处了吧,原来在这里。IRouteHandler的实例new MvcRouteHandler()也是在这里写入的。
然后启动项目,我们默认访问:16792/Home/bootstrapTest这个地址,我们来看具体的过程:
1、启动项目,首先进到全局配置文件的Application_Start()方法这里告诉我们在SwiftRouteTable.Routes这个全局静态变量里面,已经保存了路由规则、默认路由、RouteHandler对象三个重要的信息。这三个信息后面都会用到。
2、然后请求进到UrlRoutingModule里面,取SwiftRouteCollection的值:我们看到,这里的SwiftRouteCollection的值就是在全局配置文件里面配置的类型。
3、然后请求进到SwiftRouteCollection类的GetRouteData()方法里面。这个方法的作用很明显,就是解析当前的请求的url,从中获取当前的controller、action、参数等信息。这个方法执行完之后得到的SwiftRouteData对象,结果如下: 这个对象包含两个属性,RouteHandler和当前请求的路由表。 4、通过步骤3知道,当前的swiftRouteData对象包含了RouteHandler对象, IRouteHandler routeHandler = routeData.RouteHandler; 结果如下: 5、得到RouteHandler对象之后,就是从该对象的GetHttpHandler()方法里面得到当前的HttpHandler。 这个应该不难理解,将routeData和context传入MvcHandler里面。这就是为什么之前MvcHandler里面有一个两个参数的构造函数的原因。 6、然后就是执行 context.RemapHandler(httpHandler); 将请求正式交给MvcHandler。 7、在MvcHandler的ProcessRequest方法里面,首先从当前请求的路由表里面去控制器名称,如下图,得到”Home“: 8、然后就是创建控制器工厂、从工厂里面得到当前请求的控制器的对象,这部分和之前变化不大。 9、得到控制器对象之后,执行对应的当前请求的action方法,请求尽到Controller这个父类的Execute()方法里面 10、通过反射,最终执行BootstrapTest()方法。 11、BootstrapTest()方法执行完成之后,释放当前的控制器对象: factory.ReleaseController(controller); 。请求结束。 五、支持方法的重载博主对Swift.MVC框架进行了简单的扩展,使得框架支持action方法的重载。比如我们在HomeController里面定义了如下方法
public class HomeController : Controller { public void Index() { HttpContext.Current.Response.Write(); } public void Index(string id) { HttpContext.Current.Response.Write(+ id); } public void Index(string aa, string bb) { HttpContext.Current.Response.Write(); } public void BootstrapTest() { ..... } public void BootstrapTest(int id) { ..... } }
1、请求默认路由地址::16792/
2、请求地址::16792/Home/index?id=1
3、请求地址::16792/Home/index?aa=kate&bb=lucy
当然上文封装都是只是通过url传递参数的情况,等有时间可以扩展下,使得支持通过post请求传递参数。
六、总结通过上一篇和这一篇,我们基本上把MVC的核心原理涉及到的技术都重写了一遍,等有时间再扩展一个自己的”View“,加上模型验证,数据绑定,我们的Swift.MVC就算是一个相对完整的微型MVC框架了。当然,此框架仅仅是从学习理解MVC的原理层面去实现的,如果要应用于项目,还要考虑很多东西,不论如何,是个好的开始,有时间继续完善。源码地址。
如果你觉得本文能够帮助你,可以右边随意 打赏 博主,也可以 推荐 进行精神鼓励。你的支持是博主继续坚持的不懈动力。
本文原创出处:
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利