您好,登錄后才能下訂單哦!
ASP.NET MVC 描述類型(一)
前言
在前面的好多篇幅中都有提到過ControllerDescriptor類型,并且在ASP.NET MVC 過濾器(一)篇幅中簡單的描述過,今天我們就來講一下ControllerDescriptor類型。
ControllerDescriptor類型的由來
在ASP.NET MVC 過濾器(一)篇幅中有過示意圖,當時說明了在生成過濾器信息對象集合之前所要做的一些步驟中包含著生成ControllerDescriptor類型,并沒有詳細的說明,我們先來看一下圖1
圖1
關于這個示意圖之前的一些部分我就不細說了,我們就先看一下ControllerDescriptor類型的生成過程,
從圖1中可以看出ControllerDescriptor類型的由來是由ControllerDescriptorCache控制器描述類型緩存類【系統默認實現類】來生成的,ControllerDescriptorCache類型也是實現了ReaderWriterCache<Type,ControllerDescriptor>類型的,這里只要描述一下ReaderWriterCache<Type, ControllerDescriptor>類型中的實現就好了,因為ControllerDescriptorCache也只是調用了基類的某個函數來實現生成的功能。來說實現,ReaderWriterCache<Type,ControllerDescriptor>中有個鍵值隊類型的緩存變量【下文中都用緩存一詞代替】,用來存貯控制器描述類型的,實現方法的簽名和ControllerDescriptorCache的GetDescriptor()方法一樣,第一個參數是會根據當前ControllerContext中的Controller來獲取當前控制器的類型,第二個參數暫且不談稍后講解現在只要把第二個參數是當成生成ControllerDescriptor類型的外插模塊,在實現中,首先會根據ControllerType去緩存中查找,如果有的話則返回查找到的控制器描述類型,沒有的話,則會根據第二個參數來生成控制器描述類型,然后會先把生成的控制器描述類型設置到緩存中再返回生成的類型。
看到這里有的朋友會問說來說去也沒說重點,ControllerDescriptor類型到底怎么來的,對的,重點在于第二個參數,上面的描述只是讓大家更清晰的認識到Func<ControllerDescriptor>的重要性。
看一下系統的默認實現Func<ControllerDescriptor>的方式: () => newReflectedControllerDescriptor(controllerType),controllerType類型是從當前ControllerContext.Controller.GetType()獲取的。
對于ReflectedControllerDescriptor類型,在默認實現中都是把它作為ControllerDescriptor類型類使用的。
這個時候我們看一下ControllerDescriptor類型的定義,示例代碼1-1.
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
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所示的那樣。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。