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 ...
随机推荐
- charles抓包看性能数据
1.优化某个接口或加载速度(H5加载速度慢) 抓包看Overview ①看Duration,就是接口的加载时间 ②看Latency,就是延时一端传播到另一端所花费的时间:一般和网络有关:可以综合Dur ...
- USACO 6.5 章节 世界上本没有龙 屠龙的人多了也便有了
All Latin Squares 题目大意 n x n矩阵(n=2->7) 第一行1 2 3 4 5 ..N 每行每列,1-N各出现一次,求总方案数 题解 n最大为7 显然打表 写了个先数值后 ...
- 【awk】 处理多个文件
处理多个文件: 1. 可以在代码中指定读取某个文件, 其他的用命令行输入 while ( geline < "file.txt" > 0 ) { ...
- django-2-目录结构
django是MVC或者叫MTV框架
- http常见7种请求
抛砖引玉,聊下概念性的东西先: HTTP协议 (Hyper Text Transfer Protocol) HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件.图像.结果等,即是一个客 ...
- str方法
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', ' ...
- iphoneX的适配问题
iphoneX();function iphoneX(){ var oMeta = document.createElement('meta'); oMeta.setAttribute('name', ...
- 在线px转换rem工具
今天推荐一个在线工具,在线px转换rem工具 只要输入1rem = 多少px即可在线转换 和cssrem插件差不多的功能 rem在线转换工具: http://www.ofmonkey.com/fr ...
- 看不懂源码?先来恶补一波Object原型吧
目录 Object Object属性 1.Object.prototype 2.Object.name Object方法 1.Object.assign() 2.Object.create() 3.O ...
- 案例:使用xml存储数据
HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...