区域路由的注册机制

AreaRegistration.RegisterAllAreas()

 我们新建一个名称为Admin的Area,VS生成下面的代码。

复制代码

       { action = , id =

复制代码

我们先来看AreaRegistration这个抽象类,实际上,它只有一个核心功能,就是RegisterAllAreas,获取所有继承它的子类类型,然后创建它,在为他创建一个AreaRegistrationContext,在调用它的RegisterArea方法。

复制代码

     TypeCacheName =    AreaName {    RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, <Type> areaRegistrationTypes = (Type areaRegistrationType =  CreateContextAndRegister(RouteCollection routes, =  thisNamespace = (thisNamespace != +

复制代码

为什么要有AreaRegistrationContext这个类型呢?假如没有它,AreaRegistration子类创建完成时,就可以直接注册了,我们的AdminAreaRegistration的RegisterArea方法完全可以通过RouteCollection再重载一个MapRoute方法用于Area路由的注册。像下面这个样子。

复制代码

   { action = , id =

复制代码

 这样不是很好么?跟随着源码,详细瞧一瞧这个AreaRegistrationContext

AreaRegistrationContext

 这个类本质上只有一个属性,那就是命名空间。

复制代码

   HashSet<> _namespaces =  HashSet<> AreaRegistrationContext( areaName, RouteCollection routes,   AreaName { ;   ICollection<> {  RouteCollection Routes { ;    State { ;   Route MapRoute( name,  url,  defaults,  constraints,

复制代码

 我们回到核心的RegisterAllAreas方法中。

复制代码

  (AreaRegistration).IsAssignableFrom(type) &&!=    RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, <Type> areaRegistrationTypes = (Type areaRegistrationType =

复制代码

通过TypeCacheUtil.GetFilteredTypesFromAssemblies获取出来的类型必须符合IsAreaRegistrationType委托,(AreaRegistration).IsAssignableFrom(type)不难理解,必须是AreaRegistration的子类,那type.GetConstructor(Type.EmptyTypes)呢?其实一开始我也不明白它是什么意思,后来通过Console写了个小程序测试了下。

  Main(=  tac ==  tbc ==  tcc = + (tac !=  + (tbc !=  + (tcc !=

View Code

 输出:

类TA :False

类TB :False

类TC :True

请按任意键继续. . .

我们可以明白了,也就是我们的AdminAreaRegistration不能有构造器(Visual Studio生成的确实没有构造器)。但是这里为什么要这样约定呢?确实想不通,我们先继续回到刚刚的TypeCacheUtil.GetFilteredTypesFromAssemblies方法。首先,会尝试从缓存中获取类型,与往常不同的是,这里缓存的格式是xml文件,缓存的原因应该很容易理解,频繁反射会造成性能的影响,改良反射的方式有多种,这里我们学到了一种,缓存。关于TypeCacheSerializer如何工作和ReadTypesFromCache具体是如何实现的这里就不去看了,主要就是一些关于Stream和XmlDocument这两个类的操作。但是有必要提一下IBuildManager这个接口。在MVC中的实现者是BuildManagerWrapper,内部实际使用的是BuildManager(位于System.Web.Compilation),关于它的详细资料少之又少,只知道主要负责站点的动态编译和程序集的管理。我们知道可以通过AppDomain来获取应用程序相关的程序集,但这里为什么用BuilderManager呢?想必必有什么不同!

复制代码

  IEnumerable<Type> FilterTypesInAssemblies(IBuildManager buildManager, Predicate<Type>IEnumerable<Type> typesSoFar == (Assembly assembly === typesSoFar.Where(type => TypeIsPublicClass(type) &&

复制代码

我们看到这里用它获取所有的应用程序集。在foreach前打一个断点。借助即时窗口我们可以和AppDomain获取的程序集进行一个比较。

string[] Arr1 = assemblies.Cast().Select(a=>a.FullName).ToArray();

已计算表达式,表达式没有值

string[] Arr2 = AppDomain.CurrentDomain.GetAssemblies().Select(a=>a.FullName).ToArray();

已计算表达式,表达式没有值

Arr1.Length

36

Arr2.Length

42

string[] Arr3 = Arr2.Except(Arr1).ToArray();

已计算表达式,表达式没有值

Arr3

{string[6]}

    [0]: "System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    [1]: "Microsoft.Build.Utilities.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    [2]: "Microsoft.JScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    [3]: "Microsoft.VisualStudio.Web.PageInspector.Runtime, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    [4]: "Microsoft.VisualStudio.Web.PageInspector.Tracing, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    [5]: "Microsoft.VisualStudio.Debugger.Runtime, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

这里列出的几个命名空间我也不熟悉,但是大致可以了解,使用AppDomain返回的程序集是当前AppDomain下所有程序中显示使用过的类型所在的程序集(如果你对AppDomain有了解,希望不要被我误解),而BuildManager返回的是和程序运行环境甚至配置(调试)相关的程序集,我们可以这么理解,BuildManager提供更强大的功能,可以负责站点的动态编译和程序集的管理。关于AreaRegistration类型的缓存我们基本已经了解,拿到所有的AreaRegistration类型后,我们针对每一个进行一次路由配置工作。

复制代码

   RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, <Type> areaRegistrationTypes = (Type areaRegistrationType =

复制代码

具体的

复制代码

  CreateContextAndRegister(RouteCollection routes, =  thisNamespace = (thisNamespace != +

复制代码

我们来思考一下,这个thisNamespace会是什么值呢?由于这里的GetType目标是AdminAreaRegistration,(在我这里)所以是Mvc_Web.Areas.Admin,然后会被添加到这里的AreaRegistrationContext的Namespace属性中,然后调用子类重写的RegisterArea方法,最终添加到RouteCollection中,我们看最后调用的MapRoute方法。

复制代码

 Route MapRoute( name,  url,  defaults,  constraints,  (namespaces ==  && Namespaces != === useNamespaceFallback = (namespaces ==  || namespaces.Length == =

复制代码

最重要的是倒数第二行和倒数第三行,他和控制器的匹配有关,其实根据UseNamespaceFallback这个也很容易理解,如果我们的AdminAreaRegistration没有命名空间,那就允许它退回(到其他地方找)。

原文来自:技术之家

转载于:https://www.cnblogs.com/buntinginfo/p/7103515.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux系统基础知识

一、嵌入式Linux系统的构成 1、硬件 2、内核 3、应用程序&#xff08;形成根文件系统&#xff09; 二、构建嵌入式Linux系统的主要任务 1、内核部分 2、应用程序部分 嵌入式Linux的开发大致可分为三个层次&#xff1a;引导装载内核、构造文件系统和图形用户界面。作为操作系统…

各种排序笔记---基于比较排序部分

1. 选择排序 selection sort 大循环 从左到右每次以一个点开始扫描array 小循环 找到从当前起始点开始的最小值 时间复杂度为O(N^2) //selection sort an array array[] public class Solution {public int[] solve(int[] array) {if (array null || array.length 0) {return…

halcon使用点拟合圆形时候,点集顺序紊乱,不影响圆形拟合效果

read_image (Image, 截图20201226094342972.bmp) * Matching 01: BEGIN of generated code for model initialization set_system (border_shape_models, false) * Matching 01: Obtain the model image * Matching 01: The image is assumed to be made available in the * Ma…

Socket理解。

其他大部分系统&#xff0c;例如CRM/CMS/权限框架/MIS之类的&#xff0c;无论怎么复杂&#xff0c;基本上都能够本地代码本地调试&#xff0c;性能也不太重要。&#xff08;也许这个就是.net的企业级开发的战略吧&#xff09; 可是来到通讯系统&#xff0c;一切变得困难复杂。原…

多元化时代敏捷软件开发的崛起与传统软件工程的延续

多元化时代敏捷软件开发的崛起与传统软件工程的延续 1.传统软件开发模式 1.1瀑布模型 1.1.1概念 瀑布模型&#xff0c;顾名思义&#xff0c;软件开发的过程如同瀑布飞流一般&#xff0c;自上而下&#xff0c;逐级下落。瀑布模型的核心思想是将问题按照工序进行简化&#xff0c;…

【VMware vSAN 6.6】6.2.启用性能服务:vSAN硬件服务器解决方案

目录 1. 简介 1.1.适用于HCI的企业级存储2. 体系结构 2.1.带有本地存储的服务器2.2.存储控制器虚拟系统套装的缺点2.3.vSAN在vSphere Hypervisor中自带2.4.集群类型2.5.硬件部署选项3. 启用vSAN 3.1.启用vSAN3.2.轻松安装3.3.主动测试4. 可用性 4.1.对象和组件安置4.2.重新构建…

Android eclipse导入项目后出现Unable to resolve target #39;android-17#39;解决方法

eclipse导入项目后出现Unable to resolve target android-17解决方法。在最后附带还有一种编译逻辑不成功情况解决方法。 一、问题情况 二、解决的方法 1、改动项目的目标版本号与当前Android sdk相相应的版本号 2、自己主动修复一下项目 三、这个问题不是上面的。是另外情况&a…

多个圆点,鼠标选取两个,求两个点的距离,用于计算像素尺寸(halcon实现)

read_image (Image, C:/Users/22967/Desktop/晶圆找位置/0.bmp) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)binary_threshold (Image, Region1, max_separability, dark, UsedThreshold) connection (Region1, C…

修改UBOOT和LINUX调试串口(TI达芬奇芯片--DM6467)

Posted on 2011-10-31 10:53 jamiedu 阅读(889) 评论(0) 编辑 收藏 1.1 概述 TI针对DM6467提供的UBOOT和内核默认都是串口0作为调试串口输出的&#xff0c;但现在我需要使用DM6467的UART0的modem功能&#xff0c;所以修改代码&#xff0c;改变调试串口为串口2。 需要修改的主要…

halcon车刀崩边检测

list_files (新建文件夹, files, Files) read_image (Image, Files[0]) dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width/1.5, Height/1.5, black, WindowHandle) dev_set_draw (margin) dev_set_colored (12) for Index:0 to |Files…

FFMPEG解码264文件步骤

本文以H264视频流为例&#xff0c;讲解解码流数据的步骤。 为突出重点&#xff0c;本文只专注于讨论解码视频流数据&#xff0c;不涉及其它&#xff08;如开发环境的配置等&#xff09;。如果您需要这方面的信息&#xff0c;请和我联系。 准备变量 定义AVCodecContext。如果…

Confluence 6 配置服务器基础地址示例

2019独角兽企业重金招聘Python工程师标准>>> 如果 Confluence 的安装是没有安装在非根目录路径&#xff08;这个是上下文路径&#xff09;&#xff0c;然后服务器基础 URL 地址应该包括上下文地址。例如&#xff0c;你的 Confluence 正在运行在下面的地址&#xff1…

BootstrapValidator验证

bootstrap&#xff1a;能够增加兼容性的强大框架. 因为项目需要数据验证&#xff0c;看bootstrapValidator 还不错&#xff0c;就上手一直&#xff0c;完美兼容&#xff0c;话不多说。 需要引用css&#xff1a; bootstrap.min.css bootstrapValidator.min.css js: jquery-1.10.…

halcon找矩形顶点的一种方法

主程序&#xff1a; read_image (Image11, 11)*画仿射矩形 dev_set_color (green) draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)*生成仿射矩形xld gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2) *找顶点工具&#xff08;基于卡…

H264关于RTP协议的实现

完整的C&#xff0f;S架构的基于RTP&#xff0f;RTCP的H&#xff0e;264视频传输方案。此方案中&#xff0c;在服务器端和客户端分别进行了功能模块设计。服务器端&#xff1a;RTP封装模块主要是对H&#xff0e;264码流进行打包封装&#xff1b;RTCP分析模块负责产牛和发送RTCP…

华为数通HCIE面试题目解密系列之RSTP边缘端口

以下是华为数通面试考试的一道真题&#xff0c;原题如下&#xff1b; 请举例说明 stp 的 edge port 的作用,用在什么场景&#xff0c;并且使用 edge port 会碰到什么问题&#xff0c;怎么解决和防止&#xff1f; 提到边缘端口&#xff0c;我们是在NP课程的交换部分第一次接触&a…

Django:视图和URL配置

一、视图1.在mysite文件夹下。创建views.py文件&#xff08;文件名称没有特别的要求&#xff09;&#xff1b;from django.http import HttpResponsedef hello(request):return HttpResponse("Hello world")2.改动mysite文件夹下的urls.py文件&#xff1b;from djang…

u-boot 详细介绍 .

Bootloader 对于计算机系统来说&#xff0c;从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序&#xff0c;这个引导程序就叫作Bootloader。6.1.1 Bootloader介绍Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序&#xff0c;我们…

apicloud使用指南

ApiCloud ApiCloud平台介绍 ApiCloud首页在线教程文档ApiCloud是一个国内的Hybird APP平台&#xff0c;提供Hybird APP一站式开发服务。可以将使用HTML、CSS和JS制作的应用直接编译为能在安卓和IOS平台上运行的APP。另外&#xff0c;其所提供的代码托管和在线编译服务&#xff…

halcon对光源打光不均匀进行平场矫正

* Image Acquisition 01: Code generated by Image Acquisition 01 *******预处理&#xff0c;生成RGB三通道的平场矫正的图像 *1.绘制检测ROI *2.对检测的ROI进行平场矫正 *3.平场矫正方法采用均值对减方法 read_image (ImageWhite, C:/Users/Administrator/Desktop/平场矫正/…