今天在园子看到《深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的》之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后,似乎还觉得意犹未尽,或许可以更具体的来讨论一下了。也是随兴所至,如有不当,请见笑。

蒋先生还真是高产,而且也是大牛。往往寥寥数语就直击要害,然后再细细分说,读来如饮佳酿,唇齿俱香。在《ASP.NET MVC4 框架揭秘》第二章的开头,他就写道:HttpModule和HttpHandler是ASP.NET管道的两个重要的纽件。请求的最终处理通过Handler来完成,ASP.NETMVC就是通过一个名为MvcHandler的自定义HttpHandler实现了对Controller的激活和Action的执行

但是他还是很负责任的把前面对Controller和Action名称的解析简单模拟出来了。出于对他这个小框架的学习,我将其的关系图用Word画了出来。

你没有看错,就只有22个文件就把这个MVC讲的很清楚了。从上面的图我们可以看出来,前两排的东西,基本上在System.Web.Routing里面已定义好了,我们难道还要再造一遍吗,出于蒋先生的讲解,写一遍无可厚非,但是作为学习者,在理解的基础上,我认为可以改造一下。故,我决定要用源生的asp.net 的路由。

且先来看一下原生的路由是怎样的吧,图中我将蒋先生在Mini里面出现了的类名标示了一下。

其实,改造还是蛮简单的。先去掉重复的类,然后再Global里面注册路由规则,再者就是注释掉原web.config里面的自定义的UrlRoutingModule。为了不至于在Global里面注册路由规则时出现自定义的IRouteHandler的名字出来,我扩展了RouteCollection的方法了。

using System;
using System.Web.Routing; namespace Artech.MiniMvc
{
public static class MyRouteExtension
{
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults)
{
return MapRoute(routes, name, url, defaults, null, null);
} public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException("routes");
}
if (url == null)
{
throw new ArgumentNullException("url");
}
// 在这里注册 Route 与 MvcRouteHandler的映射关系
Route route = new Route(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
}; if ((namespaces != null) && (namespaces.Length > 0))
{
route.DataTokens["Namespaces"] = namespaces;
} routes.Add(name, route); return route;
}
}
}
using System;
using System.Web.Routing; namespace Artech.MiniMvc
{
public static class MyRouteExtension
{
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults)
{
return MapRoute(routes, name, url, defaults, null, null);
} public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException("routes");
}
if (url == null)
{
throw new ArgumentNullException("url");
}
// 在这里注册 Route 与 MvcRouteHandler的映射关系
Route route = new Route(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
}; if ((namespaces != null) && (namespaces.Length > 0))
{
route.DataTokens["Namespaces"] = namespaces;
} routes.Add(name, route); return route;
}
}
}
protected void Application_Start(object sender, EventArgs e)
{
// 下面注册我们项目需要匹配的路由规则。ASP.NET Route 在接收到请求后,会把请求的
// URL 和下面我们注册的路由规则相比较(可以理解为正则表达式匹配的原理), 最先
// 匹配的规则(即 Route),就由该 Route 的 RouteHandler 来处理。所以注册路由
// 很关键。 RouteTable.Routes.MapRoute("Default",
"{controller}/{action}/{*id}",
new { controller = "Home", action = "index", id = 1 }); // 下面是设置控制器工厂,MVC 内部仅仅只有一个实现了 IControllerFactory 的工厂
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory()); // 下面是给控制器工厂添加默认的命名空间,以便 MVC 在找控制器时查询速度会更快。
ControllerBuilder.Current.DefaultNamespaces.Add("WebApp");
}
        protected void Application_Start(object sender, EventArgs e)
{
// 下面注册我们项目需要匹配的路由规则。ASP.NET Route 在接收到请求后,会把请求的
// URL 和下面我们注册的路由规则相比较(可以理解为正则表达式匹配的原理), 最先
// 匹配的规则(即 Route),就由该 Route 的 RouteHandler 来处理。所以注册路由
// 很关键。 RouteTable.Routes.MapRoute("Default",
"{controller}/{action}/{*id}",
new { controller = "Home", action = "index", id = 1 }); // 下面是设置控制器工厂,MVC 内部仅仅只有一个实现了 IControllerFactory 的工厂
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory()); // 下面是给控制器工厂添加默认的命名空间,以便 MVC 在找控制器时查询速度会更快。
ControllerBuilder.Current.DefaultNamespaces.Add("WebApp");
}
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>

以上,如此这般就可以了只关注于ASP.NET MVC的Controller和Action了。仅为学习笔记罢了。

改造后的源码下载点这里

(转)深入研究MiniMVC之后续篇的更多相关文章

  1. 深入研究MiniMVC之后续篇

    今天在园子看到<深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的>之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后, ...

  2. ASP.NET MVC底层原理与框架

    前言 鄙人有一毛病,喜欢钻研原理性的东西,感觉只知道怎么用还不太够,更想知道如何实现的以及为什么会这样. 暑假的时候做积分系统是第一次接触MVC,感觉MVC就是一个框架,分为Module ,view和 ...

  3. 深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的

    前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...

  4. (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的

    原文地址:http://www.cnblogs.com/Music/p/mini-mvc.html (含代码) ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用 地址: ...

  5. (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的

    前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...

  6. 深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

    前言 几年前,Artech 老师写过一个 Mini MVC,用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的.当时我研究完以后,受益匪浅,内心充满了对 Artech 老师的感激,然后 ...

  7. 从源码研究如何不重启Springboot项目实现redis配置动态切换

    上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...

  8. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  9. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

随机推荐

  1. 【转】Jmeter安装 for windows

    总结: 一.Jmeter安装总结 1.配置Java环境变量时需要注意设置的路径需要和JDK安装的路径一样 2.配置Java环境变量时需要注意JDK的版本号 3.配置环境变量时多个变量以分号隔开,但是确 ...

  2. python开发模块基础:正则表达式

    一,正则表达式 1.字符组:[0-9][a-z][A-Z] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字.字母.标点等等.假如你现在要求一个位置&q ...

  3. sql中left join on where区别剖析

    select from tb1 left join tb2 on tb1.xx=tb2.xx and tb2.xxxx=5 先筛选tb2.xxxx=5 再把tb1与筛选后的临时表进行左连接. sele ...

  4. Oracle T4-2用jumpstart方式安装Solaris10

    在安装过程中遇到了2个问题 1) 安装时无法识别硬RAID磁盘 T4-2的2块本地盘做了硬RAID,用jumpstart安装时无法识别硬RAID磁盘,报错信息如下: {0} ok boot net - ...

  5. jenkins容器权限被拒绝

    问题,我们从官网上面pull下jenkins后,如果直接运行容器的没问题 docker run -d -p 8080:8080 -v jenkins:latest 不过我们可能需要映射下容器内部的地址 ...

  6. OpenGL3.x,4.x中使用FreeImage显示图片的BUG-黑色,或颜色分量顺序错乱

    //参照FreeImage官网给出的CTextrueManager写的加载函数 //官方给的例子是用opengl3.0以下的旧GL写的,没有使用glGenerateMipmap(GL_TEXTURE_ ...

  7. Mysql问题随记

    [用户创建并授权远程访问] CREATE USER 'username'@'host' IDENTIFIED BY 'password’;   @后面跟主机地址,即这个用户可以从哪些地址访问数据库,l ...

  8. Html Meta标签记录

    记录学习过程中碰到的meta标签 方便今后查阅 X-UA-Compatible: 设置浏览器兼容 如<meta http-equiv="X-UA-Compatible" co ...

  9. sudo apt install libreadline-dev Reading package lists... Error!

    luo@luo-ThinkPad-W540:~$ luo@luo-ThinkPad-W540:~$ luo@luo-ThinkPad-W540:~$ luo@luo-ThinkPad-W540:~$ ...

  10. java 解析xml(dom4j.jar)

    先导入jar包 <?xml version="1.0" encoding="UTF-8"?> <companys> <compan ...