ASP.NET MVCの3つの重要な記述オブジェクト:ParameterDescriptor

10316 ワード

Modelバインドは、ターゲットアクションとしてのメソッドのパラメータリストを準備するプロセスであるため、パラメータの記述こそModelバインドの核心である.ASP.NET MVCアプリケーションプログラミングインターフェースでは、ModelバインドにサービスするパラメータメタデータはParameterDescriptorタイプで表され、ActionDescriptorのGetParametersメソッドはParameterDescriptor配列を返します.
次のコード・スライスに示すように、ParameterDescriptorはICustomAttributeProviderインタフェースを実装し、対応するパラメータに適用される特性を提供します.ParameterDescriptorの読み取り専用プロパティActionDescriptorは、アクションメソッドを記述するActionDescriptorオブジェクトを表します.属性パラメータName、パラメータタイプ、およびDefaultValueは、それぞれパラメータの名前、タイプ、およびデフォルト値を表します.
   1: public abstract class ParameterDescriptor : ICustomAttributeProvider
   2: {   
   3:     public virtual object[] GetCustomAttributes(bool inherit);
   4:     public virtual object[] GetCustomAttributes(Type attributeType, bool inherit);
   5:     public virtual bool IsDefined(Type attributeType, bool inherit);
   6:     
   7:     public abstract ActionDescriptor ActionDescriptor { get; }
   8:     public abstract string ParameterName { get; }
   9:     public abstract Type ParameterType { get; }
  10:     public virtual object DefaultValue { get; }
  11:  
  12:     public virtual ParameterBindingInfo BindingInfo { get; }
  13: }

ParameterDescriptorの読み取り専用属性BindingInfoが表すSystem.Web.Mvc.ParameterBindingInfoオブジェクトは、要求データとパラメータのバインド動作を制御するためにいくつかの情報をカプセル化します.抽象クラスParameterBindingInfoには、次のコード・セグメントに示すように、IModelBinderのBinder属性のタイプが返されるModelBinderオブジェクトがModelバインド全体のコアである4つの属性があります.この章の後述では、個別に説明します.
   1: public abstract class ParameterBindingInfo
   2: {
   3:     public virtual IModelBinder Binder { get; }
   4:     
   5:     public virtual ICollection<string> Include { get; }
   6:     public virtual ICollection<string> Exclude { get; }
   7:     public virtual string Prefix { get; }
   8: }

パラメータ・タイプが複雑なタイプの場合、デフォルトでは共通の読み取り/書き込み可能なすべてのプロパティがバインドされますが、2つのICollectionタイプのプロパティIncludeとExcludeは、バインドに参加/参加しない設定のプロパティ名のリストを表示します.デフォルトでは、要求データとパラメータの間には厳密に名前でバインドされていますが、パラメータBindingInfoのPrefixプロパティに反映される、要求データ名には対応する接頭辞がある場合があります.

ReflectedParameterDescriptor


オリジナルのParameterBindingInfoは、パラメータを表すParameterInfoに対して反射することで得られ、このようなParameterBindingInfoはReflectedParameterDescriptorタイプで表される.このParameterInfoオブジェクトは、次のコード断片に示すように、読み取り専用属性ParameterInfoで表され、コンストラクション関数で初期化されます.
   1: public class ReflectedParameterDescriptor : ParameterDescriptor
   2: {   
   3:     public ReflectedParameterDescriptor(ParameterInfo parameterInfo, ActionDescriptor actionDescriptor);
   4:     public override object[] GetCustomAttributes(bool inherit);
   5:     public override object[] GetCustomAttributes(Type attributeType, bool inherit);
   6:     public override bool IsDefined(Type attributeType, bool inherit);
   7:     
   8:     public override ActionDescriptor ActionDescriptor { get; }
   9:     public override ParameterBindingInfo BindingInfo { get; }
  10:     public override object DefaultValue { get; }
  11:     public override string ParameterName { get; }
  12:     public override Type ParameterType { get; }
  13:     
  14:     public ParameterInfo ParameterInfo { get; }
  15: }

ReflectedParameterDescriptorのBindingInfoプロパティは、内部タイプのReflectedParameterBindingInfoオブジェクトを返します.このBindingInfoのIncluude、Exclude、Prefixプロパティは、パラメータに適用されるBindAttributeプロパティの解析に由来します.次のコード・セグメントに示すように、BindAttributeでも3つの属性が定義されています.ここで、IncludeとExcludeはカンマで区切り記号として使用される属性名のリストです.
   1: [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
   2: public sealed class BindAttribute : Attribute
   3: {
   4:     public bool IsPropertyAllowed(string propertyName);   
   5:     
   6:     public string Include { get; set; }
   7:     public string Exclude { get; set; }
   8:     public string Prefix { get; set;}
   9: }

ブール戻りタイプのIsPropertyAllowedメソッドは、指定した属性がバインドを許可するかどうかを判断するために使用され、属性名がIncludeリスト(またはIncludeリストが空)であり、Excludeリストでない場合にTrueを返します.そうでない場合はFalseを返します.
ASP.NET MVCの3つの重要な記述オブジェクト:ControllerDescriptor ASP.NET MVCの3つの重要な記述オブジェクト:ActionDescriptor ASP.NET MVCの3つの重要な記述オブジェクト:ControllerDescriptorとActionDescriptorの作成メカニズムASP.NET MVCの3つの重要な記述オブジェクト:ParameterDescriptor