標籤:des style blog http color 使用
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>的方式: () => new ReflectedControllerDescriptor(controllerType),controllerType類型是從當前ControllerContext.Controller.GetType()擷取的。
對於ReflectedControllerDescriptor類型,在預設實現中都是把它作為ControllerDescriptor類型類使用的。
這個時候我們看一下ControllerDescriptor類型的定義,範例程式碼1-1.
代碼1-1
public abstract class ControllerDescriptor : ICustomAttributeProvider, IUniquelyIdentifiable { protected ControllerDescriptor(); // 摘要: // 擷取控制器的名稱。 // // 返回結果: // 控制器的名稱。 public virtual string ControllerName { get; } // // 摘要: // 擷取控制器的類型。 // // 返回結果: // 控制器的類型。 public abstract Type ControllerType { get; } public virtual string UniqueId { get; } // 摘要: // 使用指定的名稱和控制器上下文來尋找操作方法。 // // 參數: // controllerContext: // 控制器上下文。 // // actionName: // 操作的名稱。 // // 返回結果: // 有關操作方法的資訊。 public abstract ActionDescriptor FindAction(ControllerContext controllerContext, string actionName); // // 摘要: // 在控制器中檢索操作-方法描述符的列表。 // // 返回結果: // 控制器中的操作-方法描述符的列表。 public abstract ActionDescriptor[] GetCanonicalActions(); public virtual object[] GetCustomAttributes(bool inherit); public virtual object[] GetCustomAttributes(Type attributeType, bool inherit); public virtual bool IsDefined(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。 public ReflectedControllerDescriptor(Type controllerType); public override sealed Type ControllerType { get; } public override ActionDescriptor FindAction(ControllerContext controllerContext, string actionName); public override ActionDescriptor[] GetCanonicalActions(); public override object[] GetCustomAttributes(bool inherit); public override object[] GetCustomAttributes(Type attributeType, bool inherit); public override bool IsDefined(Type attributeType, bool inherit);}
對於ReflectedControllerDescriptor類型的具體實現,在這裡只是簡要的說明一下,ReflectedControllerDescriptor類型的建構函式參數為Type類型,這裡上面也說過這是Controller類型,在建構函式構造的時候,ReflectedControllerDescriptor類型內部還有個ActionMethodSelector類型的私人變數,ActionMethodSelector類型的建構函式所需參數也是Type類型。這裡為什麼要說到ActionMethodSelector類型呢?因為在ReflectedControllerDescriptor類型的FindAction()方法的具體實現中使用的就是ActionMethodSelector類型中的方法。就1所示的那樣。
金源
出處:http://www.cnblogs.com/jin-yuan/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面