新聞中心
ASP.NET MVC描述類型(一)
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寧洱ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寧洱網(wǎng)站制作公司
前言
在前面的好多篇幅中都有提到過(guò)ControllerDescriptor類型,并且在ASP.NET MVC 過(guò)濾器(一)篇幅中簡(jiǎn)單的描述過(guò),今天我們就來(lái)講一下ControllerDescriptor類型。
ControllerDescriptor類型的由來(lái)
在ASP.NET MVC 過(guò)濾器(一)篇幅中有過(guò)示意圖,當(dāng)時(shí)說(shuō)明了在生成過(guò)濾器信息對(duì)象集合之前所要做的一些步驟中包含著生成ControllerDescriptor類型,并沒有詳細(xì)的說(shuō)明,我們先來(lái)看一下圖1
圖1
關(guān)于這個(gè)示意圖之前的一些部分我就不細(xì)說(shuō)了,我們就先看一下ControllerDescriptor類型的生成過(guò)程,
從圖1中可以看出ControllerDescriptor類型的由來(lái)是由ControllerDescriptorCache控制器描述類型緩存類【系統(tǒng)默認(rèn)實(shí)現(xiàn)類】來(lái)生成的,ControllerDescriptorCache類型也是實(shí)現(xiàn)了ReaderWriterCache
看到這里有的朋友會(huì)問說(shuō)來(lái)說(shuō)去也沒說(shuō)重點(diǎn),ControllerDescriptor類型到底怎么來(lái)的,對(duì)的,重點(diǎn)在于第二個(gè)參數(shù),上面的描述只是讓大家更清晰的認(rèn)識(shí)到Func
看一下系統(tǒng)的默認(rèn)實(shí)現(xiàn)Func
對(duì)于ReflectedControllerDescriptor類型,在默認(rèn)實(shí)現(xiàn)中都是把它作為ControllerDescriptor類型類使用的。
這個(gè)時(shí)候我們看一下ControllerDescriptor類型的定義,示例代碼1-1.
public abstract class ControllerDescriptor: ICustomAttributeProvider,IUniquelyIdentifiable { protectedControllerDescriptor(); // 摘要: // 獲取控制器的名稱。 // // 返回結(jié)果: // 控制器的名稱。 public virtual stringControllerName { get; } // // 摘要: // 獲取控制器的類型。 // // 返回結(jié)果: // 控制器的類型。 public abstract TypeControllerType { get; } public virtual stringUniqueId { get; } // 摘要: // 使用指定的名稱和控制器上下文來(lái)查找操作方法。 // // 參數(shù): // controllerContext: // 控制器上下文。 // // actionName: // 操作的名稱。 // // 返回結(jié)果: // 有關(guān)操作方法的信息。 public abstract ActionDescriptorFindAction(ControllerContextcontrollerContext, string actionName); // // 摘要: // 在控制器中檢索操作-方法描述符的列表。 // // 返回結(jié)果: // 控制器中的操作-方法描述符的列表。 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屬性表示著當(dāng)前控制器上下文中的控制器名稱,ControllerType屬性是被定義為抽象的了,需要在派生類中的實(shí)現(xiàn)的(ReflectedControllerDescriptor類型),F(xiàn)indAction()也是抽象的,看這個(gè)方法的返回類型就知道了它是做什么用的了,對(duì)于這部分的細(xì)節(jié)都是在默認(rèn)實(shí)現(xiàn)類ReflectedControllerDescriptor類型中表示,來(lái)看ReflectedControllerDescriptor類型的定義,示例代碼1-2
代碼1-2
public class ReflectedControllerDescriptor : ControllerDescriptor { // // 參數(shù): // controllerType: // 控制器的類型。 // // 異常: // System.ArgumentNullException: // controllerType 參數(shù)為 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); }
對(duì)于ReflectedControllerDescriptor類型的具體實(shí)現(xiàn),在這里只是簡(jiǎn)要的說(shuō)明一下,ReflectedControllerDescriptor類型的構(gòu)造函數(shù)參數(shù)為Type類型,這里上面也說(shuō)過(guò)這是Controller類型,在構(gòu)造函數(shù)構(gòu)造的時(shí)候,ReflectedControllerDescriptor類型內(nèi)部還有個(gè)ActionMethodSelector類型的私有變量,ActionMethodSelector類型的構(gòu)造函數(shù)所需參數(shù)也是Type類型。這里為什么要說(shuō)到ActionMethodSelector類型呢?因?yàn)樵赗eflectedControllerDescriptor類型的FindAction()方法的具體實(shí)現(xiàn)中使用的就是ActionMethodSelector類型中的方法。就如圖1所示的那樣。
當(dāng)前文章:ASP.NETMVC描述類型(一)
網(wǎng)站鏈接:http://www.ef60e0e.cn/article/gpchoj.html