溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC 描述類型(一)

發(fā)布時(shí)間:2020-07-18 17:21:38 來(lái)源:網(wǎng)絡(luò) 閱讀:964 作者:jinyuan0829 欄目:編程語(yǔ)言

ASP.NET MVC 描述類型()

前言

在前面的好多篇幅中都有提到過ControllerDescriptor類型,并且在ASP.NET MVC 過濾器()篇幅中簡(jiǎn)單的描述過,今天我們就來(lái)講一下ControllerDescriptor類型。

 

ControllerDescriptor類型的由來(lái)

ASP.NET MVC 過濾器()篇幅中有過示意圖,當(dāng)時(shí)說(shuō)明了在生成過濾器信息對(duì)象集合之前所要做的一些步驟中包含著生成ControllerDescriptor類型,并沒有詳細(xì)的說(shuō)明,我們先來(lái)看一下圖1

1

ASP.NET MVC 描述類型(一)

關(guān)于這個(gè)示意圖之前的一些部分我就不細(xì)說(shuō)了,我們就先看一下ControllerDescriptor類型的生成過程,

從圖1中可以看出ControllerDescriptor類型的由來(lái)是由ControllerDescriptorCache控制器描述類型緩存類【系統(tǒng)默認(rèn)實(shí)現(xiàn)類】來(lái)生成的,ControllerDescriptorCache類型也是實(shí)現(xiàn)了ReaderWriterCache<Type,ControllerDescriptor>類型的,這里只要描述一下ReaderWriterCache<Type, ControllerDescriptor>類型中的實(shí)現(xiàn)就好了,因?yàn)?/span>ControllerDescriptorCache也只是調(diào)用了基類的某個(gè)函數(shù)來(lái)實(shí)現(xiàn)生成的功能。來(lái)說(shuō)實(shí)現(xiàn),ReaderWriterCache<Type,ControllerDescriptor>中有個(gè)鍵值隊(duì)類型的緩存變量【下文中都用緩存一詞代替】,用來(lái)存貯控制器描述類型的,實(shí)現(xiàn)方法的簽名和ControllerDescriptorCacheGetDescriptor()方法一樣,第一個(gè)參數(shù)是會(huì)根據(jù)當(dāng)前ControllerContext中的Controller來(lái)獲取當(dāng)前控制器的類型,第二個(gè)參數(shù)暫且不談稍后講解現(xiàn)在只要把第二個(gè)參數(shù)是當(dāng)成生成ControllerDescriptor類型的外插模塊,在實(shí)現(xiàn)中,首先會(huì)根據(jù)ControllerType去緩存中查找,如果有的話則返回查找到的控制器描述類型,沒有的話,則會(huì)根據(jù)第二個(gè)參數(shù)來(lái)生成控制器描述類型,然后會(huì)先把生成的控制器描述類型設(shè)置到緩存中再返回生成的類型。

看到這里有的朋友會(huì)問說(shuō)來(lái)說(shuō)去也沒說(shuō)重點(diǎn),ControllerDescriptor類型到底怎么來(lái)的,對(duì)的,重點(diǎn)在于第二個(gè)參數(shù),上面的描述只是讓大家更清晰的認(rèn)識(shí)到Func<ControllerDescriptor>的重要性。

看一下系統(tǒng)的默認(rèn)實(shí)現(xiàn)Func<ControllerDescriptor>的方式: () => newReflectedControllerDescriptor(controllerType),controllerType類型是從當(dāng)前ControllerContext.Controller.GetType()獲取的。

對(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類型),FindAction()也是抽象的,看這個(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ō)過這是Controller類型,在構(gòu)造函數(shù)構(gòu)造的時(shí)候,ReflectedControllerDescriptor類型內(nèi)部還有個(gè)ActionMethodSelector類型的私有變量,ActionMethodSelector類型的構(gòu)造函數(shù)所需參數(shù)也是Type類型。這里為什么要說(shuō)到ActionMethodSelector類型呢?因?yàn)樵?/span>ReflectedControllerDescriptor類型的FindAction()方法的具體實(shí)現(xiàn)中使用的就是ActionMethodSelector類型中的方法。就如圖1所示的那樣。



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI