zoukankan      html  css  js  c++  java
  • (转)深入研究MiniMVC之后续篇

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

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

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

    http://images.cnblogs.com/cnblogs_com/SLKnate/569293/o_MiniMVC.png

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

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

    http://images.cnblogs.com/cnblogs_com/SLKnate/569293/o_system.web.routing.png

    其实,改造还是蛮简单的。先去掉重复的类,然后再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了。仅为学习笔记罢了。

    改造后的源码下载点这里

  • 相关阅读:
    跳槽“六要”你懂吗?[转载]
    基于RFID 技术的仓储物流入库流程设计[转载]
    RFID:物流时代的新宠儿[转载]
    WEB界面设计五种特征[转]
    全国物流快递查询网址大全
    职员想跳槽,公司应检讨[转]
    商品条码管理办法 (2005)
    让总裁夜不成眠三件事[转]
    Google地图的配色问题(以及MapBar和51ditu)
    薪酬公开还是保密[转]
  • 原文地址:https://www.cnblogs.com/teng-0802/p/9083951.html
Copyright © 2011-2022 走看看