写自已的System.Web.Routing.dll提升性能和增加功能!

  前文《ASP.NET MVC 框架实践总结》发布后,得到了一些朋友的反馈,当然更多的是批评。这就是技术员的严谨作风!

  虽然尽是批评,但是我还是要写一些自己的学习感受,但是我可以负责任的说:每个人都有他的观点和经验,程序员必须博采众长,才能。。。(作个推广^_^)

  上文提到routing不是很灵活的原由是因为我们这个项目有很多的controller和action ,要想追求路径友好,我们就得写很多路由规则,根据以前路径重写的习惯,我们希望能通过强大的正则定义来归并路由表,简化路由表,维护及性能也会有所有提升。但是当我来整理和归并路由表时遇到了麻烦,大大超出我的预期:它不是百分百的支持正则机制!

  解决办法是有两个:写一堆路由表和修改或增强system.web.routing。我们选择了前者!

  但是前段时间开始对项目的性能进行优化,就又将system.web.mvc及routing的源码研究了一番,就像读书,每次读都有不同的感受,这次我更加深该的认识到了它的设计理念——设计模式和扩展性,同时也认识到了它的一些细节直接会导致损失一些性能,特别是当我能过reflector反编译到system.web.routing.dll源码并认真的学习理解的过程中收获非常多(有很多知识点是以前没有见过的),但是它有n个类,一个请求进来转了九曲十八湾,我跟得眼都花了(水平有限),进行路由选择的实现细节(代码)和算法才搞清楚。搞清楚后我立即有一个想法:我要自己实现它。理由很简单:它的代码链条太亢长,实现过程太繁琐,性能当然不会高到哪去。于是我对它进行了大刀阔斧的修改。

  项目文件结构如下:


类结构如下: 

 

  比原来的精减了很多,以上的文件列表中我们只是写了route.cs其它的文件全是system.web.routing的源码,与原system.web.routing 应用方式和接口百分百兼容。我的处理包括三个方法:初始化路由表PreParseRoute,路由选择GetRouteData,url输出GetVirtualPath。完整代码如下,朋友们发现问题或更好的实现请告诉我:

route.cs

  下一篇将写一下system.web.mvc的性能问题及我们的修改(由于现在我们还在测试它的稳定性,下篇文章会附上源码)。

 

posted @ 2008-09-11 11:00  一挥  阅读(3163)  评论(15编辑  收藏  举报