Area--->AreaRegister.RegisterAllArea()与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区域的解析的更多相关文章
- 在ASP.NET MVC中使用Area区域
在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来,比如:Admin,Customer,Bill.ASP.NET MVC项目中把各 ...
- ASP.NET MVC5使用Area区域
转载:http://www.lanhusoft.com/Article/217.html 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它 ...
- MVC ASP.NET MVC5使用Area区域
MVC ASP.NET MVC5使用Area区域 一.为什么要使用area? 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来 ...
- mvc Area(区域)相关技术
ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所 ...
- MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area
最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...
- Area 使用
[ASP.NET MVC 小牛之路]08 - Area 使用 ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Ar ...
- HTML <area><map>标签及在实际开发中的应用
之前,我一直以为HTML <area>是一个鸡肋HTML,估计到了HTML5时代会被废弃的命.但是,最近一查资料,乖乖了个咚,不仅没被废弃,反而发展了,新增了一些标签属性,例如rel,me ...
- Area的使用
本文转自-->王亮的博客文章[ASP.NET MVC 小牛之路]08 - Area 使用 文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解 ...
- [ASP.NET MVC 小牛之路]08 - Area 使用
ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Cont ...
随机推荐
- (63)C# 不安全代码unsafe
unsafe fixed stackalloc void*
- VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零
精简置备(thin): 精 简配置就是无论磁盘分配多大,实际占用存储大小是现在使用的大小,即用多少算多少.当客户机有输入输出的时候,VMkernel首先分配需要的空间并进行 清零操作,也就是说如果使用 ...
- 如何让Jmeter压力测试减少压力机的资源消耗
如下是官方的一些建议: 1. 使用非gui模式,例如 jmeter -n -t test.jmx -l test.jtl 2. 尽量用较少的监听器(listeners):如果使用了-l 标致像上面一样 ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
- C++中的函数重载分析(二)
1,重载与指针: 1,下面的函数指针将保存哪个函数的地址? int func(int x) { return x; } int func(int a, int b) { return a + b; } ...
- [模板]网络最大流 & 最小费用最大流
我的作业部落有学习资料 可学的知识点 Dinic 模板 #define rg register #define _ 10001 #define INF 2147483647 #define min(x ...
- vue基础学习一
写一个例子,告诉你VUE的方便之处,就是双向绑定,不需要操作DOM对象,而是操作数据 div中msg 和JS中msg是一一对应的 然后看浏览器中 然后如果我想改变浏览器中值,我在console这么操作 ...
- 64.二叉搜索树的第K个节点
题目描述: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 思路分析: 根据二叉搜索树的特殊性,我们中序遍历它 ...
- 想实现网页滚动一定距离底部弹出div
<script type="text/javascript"> $(window).scroll(function () { if ($(this).scrollTop ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) { # 打开文件 $handle = fopen($file, 'rb'); while (feof($ ...