(转)深入研究MiniMVC之后续篇
今天在园子看到《深入研究 蒋金楠(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之后续篇的更多相关文章
- 深入研究MiniMVC之后续篇
今天在园子看到<深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的>之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后, ...
- ASP.NET MVC底层原理与框架
前言 鄙人有一毛病,喜欢钻研原理性的东西,感觉只知道怎么用还不太够,更想知道如何实现的以及为什么会这样. 暑假的时候做积分系统是第一次接触MVC,感觉MVC就是一个框架,分为Module ,view和 ...
- 深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的
前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...
- (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的
原文地址:http://www.cnblogs.com/Music/p/mini-mvc.html (含代码) ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用 地址: ...
- (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的
前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...
- 深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的
前言 几年前,Artech 老师写过一个 Mini MVC,用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的.当时我研究完以后,受益匪浅,内心充满了对 Artech 老师的感激,然后 ...
- 从源码研究如何不重启Springboot项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...
随机推荐
- 【转】Jmeter安装 for windows
总结: 一.Jmeter安装总结 1.配置Java环境变量时需要注意设置的路径需要和JDK安装的路径一样 2.配置Java环境变量时需要注意JDK的版本号 3.配置环境变量时多个变量以分号隔开,但是确 ...
- python开发模块基础:正则表达式
一,正则表达式 1.字符组:[0-9][a-z][A-Z] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字.字母.标点等等.假如你现在要求一个位置&q ...
- 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 ...
- Oracle T4-2用jumpstart方式安装Solaris10
在安装过程中遇到了2个问题 1) 安装时无法识别硬RAID磁盘 T4-2的2块本地盘做了硬RAID,用jumpstart安装时无法识别硬RAID磁盘,报错信息如下: {0} ok boot net - ...
- jenkins容器权限被拒绝
问题,我们从官网上面pull下jenkins后,如果直接运行容器的没问题 docker run -d -p 8080:8080 -v jenkins:latest 不过我们可能需要映射下容器内部的地址 ...
- OpenGL3.x,4.x中使用FreeImage显示图片的BUG-黑色,或颜色分量顺序错乱
//参照FreeImage官网给出的CTextrueManager写的加载函数 //官方给的例子是用opengl3.0以下的旧GL写的,没有使用glGenerateMipmap(GL_TEXTURE_ ...
- Mysql问题随记
[用户创建并授权远程访问] CREATE USER 'username'@'host' IDENTIFIED BY 'password’; @后面跟主机地址,即这个用户可以从哪些地址访问数据库,l ...
- Html Meta标签记录
记录学习过程中碰到的meta标签 方便今后查阅 X-UA-Compatible: 设置浏览器兼容 如<meta http-equiv="X-UA-Compatible" co ...
- 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:~$ ...
- java 解析xml(dom4j.jar)
先导入jar包 <?xml version="1.0" encoding="UTF-8"?> <companys> <compan ...