ASP.NET MVC 描述类型(一)

简介:

ASP.NET MVC 描述类型()

前言

在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器()篇幅中简单的描述过,今天我们就来讲一下ControllerDescriptor类型。

 

ControllerDescriptor类型的由来

ASP.NET MVC 过滤器()篇幅中有过示意图,当时说明了在生成过滤器信息对象集合之前所要做的一些步骤中包含着生成ControllerDescriptor类型,并没有详细的说明,我们先来看一下图1

1

wKiom1PGj_aR6n7pAAK9X-kV09Y273.jpg

关于这个示意图之前的一些部分我就不细说了,我们就先看一下ControllerDescriptor类型的生成过程,

从图1中可以看出ControllerDescriptor类型的由来是由ControllerDescriptorCache控制器描述类型缓存类【系统默认实现类】来生成的,ControllerDescriptorCache类型也是实现了ReaderWriterCache<Type,ControllerDescriptor>类型的,这里只要描述一下ReaderWriterCache<Type, ControllerDescriptor>类型中的实现就好了,因为ControllerDescriptorCache也只是调用了基类的某个函数来实现生成的功能。来说实现,ReaderWriterCache<Type,ControllerDescriptor>中有个键值队类型的缓存变量【下文中都用缓存一词代替】,用来存贮控制器描述类型的,实现方法的签名和ControllerDescriptorCacheGetDescriptor()方法一样,第一个参数是会根据当前ControllerContext中的Controller来获取当前控制器的类型,第二个参数暂且不谈稍后讲解现在只要把第二个参数是当成生成ControllerDescriptor类型的外插模块,在实现中,首先会根据ControllerType去缓存中查找,如果有的话则返回查找到的控制器描述类型,没有的话,则会根据第二个参数来生成控制器描述类型,然后会先把生成的控制器描述类型设置到缓存中再返回生成的类型。

看到这里有的朋友会问说来说去也没说重点,ControllerDescriptor类型到底怎么来的,对的,重点在于第二个参数,上面的描述只是让大家更清晰的认识到Func<ControllerDescriptor>的重要性。

看一下系统的默认实现Func<ControllerDescriptor>的方式: () => newReflectedControllerDescriptor(controllerType)controllerType类型是从当前ControllerContext.Controller.GetType()获取的。

对于ReflectedControllerDescriptor类型,在默认实现中都是把它作为ControllerDescriptor类型类使用的。

这个时候我们看一下ControllerDescriptor类型的定义,示例代码1-1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  abstract  class  ControllerDescriptor: ICustomAttributeProvider,IUniquelyIdentifiable
     {
  
         protectedControllerDescriptor();
  
         // 摘要:
         //     获取控制器的名称。
         //
         // 返回结果:
         //     控制器的名称。
         public  virtual  stringControllerName {  get ; }
         //
         // 摘要:
         //     获取控制器的类型。
         //
         // 返回结果:
         //     控制器的类型。
         public  abstract  TypeControllerType {  get ; }
         public  virtual  stringUniqueId {  get ; }
  
         // 摘要:
         //     使用指定的名称和控制器上下文来查找操作方法。
         //
         // 参数:
         //   controllerContext:
         //     控制器上下文。
         //
         //   actionName:
         //     操作的名称。
         //
         // 返回结果:
         //     有关操作方法的信息。
         public  abstract  ActionDescriptorFindAction(ControllerContextcontrollerContext,  string  actionName);
         //
         // 摘要:
         //     在控制器中检索操作-方法描述符的列表。
         //
         // 返回结果:
         //     控制器中的操作-方法描述符的列表。
         public  abstract  ActionDescriptor[]GetCanonicalActions();
         public  virtual  object []GetCustomAttributes( bool  inherit);
         public  virtual  object []GetCustomAttributes(Type attributeType,  bool  inherit);
         public  virtual  boolIsDefined(Type attributeType,  bool  inherit);
     }


在代码1-1中,大家也都是看到了ControllerDescriptor类型的定义是抽象类型,其中ControllerName属性表示着当前控制器上下文中的控制器名称,ControllerType属性是被定义为抽象的了,需要在派生类中的实现的(ReflectedControllerDescriptor类型),FindAction()也是抽象的,看这个方法的返回类型就知道了它是做什么用的了,对于这部分的细节都是在默认实现类ReflectedControllerDescriptor类型中表示,来看ReflectedControllerDescriptor类型的定义,示例代码1-2

代码1-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  class  ReflectedControllerDescriptor : ControllerDescriptor
     {
         //
         // 参数:
         //   controllerType:
         //     控制器的类型。
         //
         // 异常:
         //   System.ArgumentNullException:
         //     controllerType 参数为 null。
         publicReflectedControllerDescriptor(TypecontrollerType);
         public  override  sealed  Type ControllerType {  get ;}
         public  override  ActionDescriptorFindAction(ControllerContextcontrollerContext,  string  actionName);
         public  override  ActionDescriptor[]GetCanonicalActions();
         public  override  object []GetCustomAttributes( bool  inherit);
         public  override  object []GetCustomAttributes(Type attributeType,  bool  inherit);
         public  override  boolIsDefined(Type attributeType,  bool  inherit);
}


对于ReflectedControllerDescriptor类型的具体实现,在这里只是简要的说明一下,ReflectedControllerDescriptor类型的构造函数参数为Type类型,这里上面也说过这是Controller类型,在构造函数构造的时候,ReflectedControllerDescriptor类型内部还有个ActionMethodSelector类型的私有变量,ActionMethodSelector类型的构造函数所需参数也是Type类型。这里为什么要说到ActionMethodSelector类型呢?因为在ReflectedControllerDescriptor类型的FindAction()方法的具体实现中使用的就是ActionMethodSelector类型中的方法。就如图1所示的那样。





     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1439207,如需转载请自行联系原作者




相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
116 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
113 0
|
9月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
144 0