高仿卡地亚手表网站,手机网站技术方案,百度seo优化系统,wordpress企业网站模板下载AreaRegistration.RegisterAllAreas() 我们新建一个名称为Admin的Area#xff0c;VS生成下面的代码。 { action , id 我们先来看AreaRegistration这个抽象类#xff0c;实际上#xff0c;它只有一个核心功能#xff0c;就是RegisterAllAreas#xff0c;获取所有继承它的…AreaRegistration.RegisterAllAreas() 我们新建一个名称为Admin的AreaVS生成下面的代码。 { 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呢想必必有什么不同 IEnumerableType FilterTypesInAssemblies(IBuildManager buildManager, PredicateTypeIEnumerableType typesSoFar (Assembly assembly typesSoFar.Where(type TypeIsPublicClass(type) 我们看到这里用它获取所有的应用程序集。在foreach前打一个断点。借助即时窗口我们可以和AppDomain获取的程序集进行一个比较。 string[] Arr1 assemblies.Cast().Select(aa.FullName).ToArray(); 已计算表达式表达式没有值 string[] Arr2 AppDomain.CurrentDomain.GetAssemblies().Select(aa.FullName).ToArray(); 已计算表达式表达式没有值 Arr1.Length 36 Arr2.Length 42 string[] Arr3 Arr2.Except(Arr1).ToArray(); 已计算表达式表达式没有值 Arr3 {string[6]} [0]: System.Runtime.Caching, Version4.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a [1]: Microsoft.Build.Utilities.v4.0, Version4.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a [2]: Microsoft.JScript, Version10.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a [3]: Microsoft.VisualStudio.Web.PageInspector.Runtime, Version15.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a [4]: Microsoft.VisualStudio.Web.PageInspector.Tracing, Version15.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a [5]: Microsoft.VisualStudio.Debugger.Runtime, Version15.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a 这里列出的几个命名空间我也不熟悉但是大致可以了解使用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