您好,登錄后才能下訂單哦!
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
關(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)方法的簽名和ControllerDescriptorCache的GetDescriptor()方法一樣,第一個(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所示的那樣。
免責(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)容。