文章引导

MVC路由解析---IgnoreRoute

MVC路由解析---MapRoute

MVC路由解析---UrlRoutingModule

Area的使用

Area--->AreaRegister.RegisterAllArea()与Area区域的解析

引言:

学习本文建议先看下另一篇文章(Area的使用),此篇文章着重解析AreaRegister.RegisterAllArea()与Area的关联性。

一.从AreaRegistration.RegiatrationAllArea说起:

MVC的Application_Start函数的第一句代码就是AreaRegistration.RegisterAlllArea()。我们今天要讲的内容也是仿真.NET的AreaRegistration.RegisterAllArea()来说起。我们先来讲讲RegisterAllArea的执行过程。

第一步:

        public static void RegisterAllAreas()
{
RegisterAllAreas(null);
}
public static void RegisterAllAreas(object state)
{
RegisterAllAreas(RouteTable.Routes, new BuildManagerWrapper(), state);
}
public static void RegisterAllAreas(RouteCollection routes,IBuildManager builder,object state)
{
using (List<Type>.Enumerator enumator = TypeCacheUtil.GetFilteredTypesFromAssemblies("MVC-AreaRegistrationTypeCache.xml",
new Predicate<Type>(AreaRegistration.IsAreaRegistrationType),
builder
).GetEnumerator())
{
while(enumator.MoveNext())
{
((AreaRegistration)Activator.CreateInstance(enumator.Current)).CreateContextAndRegister(routes, state);
}
}
}

可以看的到,程序先进入RegisterAllArea(),然后通过赋予参数null,来执行RegisterAllArea(null)从而来执行接下来的同名函数RegisterAlllArea(object state)。这里还没有完,接着继续进行RegisterAllArea(RouteTable.Routes,new BuildManagerWrapper(),state)。这里的RouteTable是一个RouteCollection的单例对象,具体内容可以看我的此系列的相关文章。

走到这一步我们看到进入到真正的执行内容了,接着解析下图

上图的函数的意义:先从UserCache缓存文件夹找寻是否存在对应的xml缓存文件。如果不存在,则将所有继承AreaRegister的类,将其都进行实例化、生成对象、并调用RegisterArea(AreaRegistrationContext)进行路由注册。

二.GetFilteredTypesFromAssemblies解析:

上面总体说了关于此函数的意义,接下来我们来深入解剖代码:

 public static List<Type> GetFilteredTypesFromAssemblies(string cacheName,Predicate<Type> predicate,IBuildManager buildManager)
{
TypeCacheSerializer serializer = new TypeCacheSerializer();
List<Type> matchingTypes = ReadTypesFromCache(cacheName, predicate, buildManager, serializer);
if(matchingTypes==null)
{
matchingTypes = FilterTypesInAssemblies(buildManager, predicate).ToList<Type>();
SaveTypesToCache(cacheName, matchingTypes, buildManager, serializer);
}
return matchingTypes; }
private static IEnumerable<Type> FilterTypesInAssemblies(IBuildManager buildManager, Predicate<Type> predicate)
{
IEnumerable<Type> emptyTypes = Type.EmptyTypes;
foreach (Assembly assembly in buildManager.GetReferencedAssemblies())
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException exception1)
{
types = exception1.Types;
}
emptyTypes = emptyTypes.Concat<Type>(types);
}
return (from type in emptyTypes
where TypeIsPublicClass(type) && predicate(type)
select type);
}
internal static void SaveTypesToCache(string cacheName, IList<Type> matchingTypes, IBuildManager buildManager, TypeCacheSerializer serializer)
{
try
{
Stream stream = buildManager.CreateCachedFile(cacheName);
if (stream != null)
{
using (StreamWriter writer = new StreamWriter(stream))
{
serializer.SerializeTypes(matchingTypes, writer);
}
}
}
catch
{
}
}

ReadTypesFromCache这个函数是先从缓存文件中找有没有缓存,一般情况是没有的。所以,我们直接略过(此段源代码也十分简单)。我们先看看FilterTypesInAssemblies代码,解析如下:

所有继承或实现AreaRegister的对象类都被找出来了,现在就是将这些对象序列化之后,写入MVC-AreaRegistrationTypeCache.xml文件里。我们接下来看看

三.CreateContextAndRegister解析:

CreateContextAndRegister对过滤后的对象实例化,并调用RegisterArea函数进行注册。

看到这里,用过Area的都知道庐山真面目了,看下图就知道了。

下一篇文章我们就要好好讲讲AreaRegistrationContext.MapRoute函数了。

四.总结:

总体上说来,RegisterAllArea方法的第一步是查看缓存文件内是否存在并有缓存信息,如果没有,则查找寻找当前项目所有继承或实现了AreaRegistration的对象。将这些对象信息缓存进缓存文件内,并实例化这些对象调用AreaRegistrationContext.MapRoute进行路由注册。

源码下载链接

Area--->AreaRegister.RegisterAllArea()与Area区域的解析的更多相关文章

  1. 在ASP.NET MVC中使用Area区域

    在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来,比如:Admin,Customer,Bill.ASP.NET MVC项目中把各 ...

  2. ASP.NET MVC5使用Area区域

    转载:http://www.lanhusoft.com/Article/217.html 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它 ...

  3. MVC ASP.NET MVC5使用Area区域

    MVC  ASP.NET MVC5使用Area区域 一.为什么要使用area? 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来 ...

  4. mvc Area(区域)相关技术

    ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所 ...

  5. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area

    最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...

  6. Area 使用

    [ASP.NET MVC 小牛之路]08 - Area 使用 ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Ar ...

  7. HTML <area><map>标签及在实际开发中的应用

    之前,我一直以为HTML <area>是一个鸡肋HTML,估计到了HTML5时代会被废弃的命.但是,最近一查资料,乖乖了个咚,不仅没被废弃,反而发展了,新增了一些标签属性,例如rel,me ...

  8. Area的使用

    本文转自-->王亮的博客文章[ASP.NET MVC 小牛之路]08 - Area 使用 文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解 ...

  9. [ASP.NET MVC 小牛之路]08 - Area 使用

    ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Cont ...

随机推荐

  1. lombda 使用记录

    ,,,}; String str1 = Arrays.stream(arr).boxed().map(i -> i.toString()) //必须将普通数组 boxed才能 在 map 里面 ...

  2. Oracle -操作数据库

    删除数据: delete:用delete删除记录,Oracle系统会产生回滚记录,所以这种操作可以使用ROLLBACK来撤销 truncate:删除数据时,不会产生回滚记录.所以执行速度相对较快些 可 ...

  3. iview+vue 表格中添加图片

    开门见山,话不多说,要在表格中添加图片,可以使用td: <table " width="100%"> <tr class="tr-style ...

  4. python排序算法-冒泡和快速排序,解答阿里面试题

    ''常见的排序算法\ 插入排序/希尔排序/直接排序/堆排序 冒泡排序/快速排序/归序排序/基数排序 给定一个列表,将这个列表进行排序,要求:> 时间复杂度要小于O(n^2) 复杂度:1.时间复杂 ...

  5. taintCheck的实现

    参考:http://bitblaze.cs.berkeley.edu/papers/taintcheck-full.pdf 1. 应用taint analysis需要解决三个问题 a. 哪些input ...

  6. POJ 1860 Currency Exchange (Bellman-Ford)

    题目链接:POJ 1860 Description Several currency exchange points are working in our city. Let us suppose t ...

  7. linux下部署springboot vue项目

    使用的工具是 XFTP5 XSHELL5 docker pull gmaslowski/jdk 拉取jdk docker images 查询下载的镜像ID (如:390b58b1be42) docke ...

  8. 学习contiki需要知道的一些概念和注意事项

    概念: 1.宏:所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务.Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作 ...

  9. JavaScript 盖尔-沙普利算法

    最近在学 JavaScript , 为了尽快熟悉语法,决定移植以前写的盖尔-沙普利算法. c# 下的代码:https://www.cnblogs.com/aitong/p/10973774.html ...

  10. Apache之默认配置文件解释

    一.默认配置文件 # 定义apache运行的目录,即程序所在的位置 ServerRoot "/usr/local/apache2" # 定义Apache服务监听的端口 Listen ...