asp.NetModelメタデータ学習3

4732 ワード

5.Modelメタデータの提供メカニズム
Modelメタデータを表すModelMetadataオブジェクトは、最終的にはModelMetadataProviderという名前のオブジェクトによって提供され、Modelメタデータの提供メカニズムはModelMetadataProviderを核心とする.まずModelMetadataの構造関数を見てみましょう.
public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor,Type modelType,string propertyName);

ModelMetadataクラスで一意のコンストラクション関数を定義するには、前述したように、属性に対するModelメタデータを作成する場合は、パラメータpropertyNameとcontainerTypeで属性名とコンテナ名を指定します.パラメータModelTypeは対応するデータ型を表し、ModelAccessorはModelオブジェクト(データオブジェクト)として取得する依頼である.ASP.NET MVCは、データ注記特性に基づく宣言式の宣言式メタデータ定義方法を採用しているので、この方法で定義されたModelメタデータを表すDataAnnotationsModelMetadataというクラスを定義している.次のコードクリップのように、このクラスはGetSimpleDisplayTextメソッドを書き換え、単純に表示されるテキストの戻り値がSimpleDisplayTextプロパティとして使用されることを示します.このコンストラクション関数には、このプロパティオブジェクトに基づいて作成された
        public class DataAnnotationsModelMetadata : ModelMetadata
        {
            public DataAnnotationsModelMetadata(DataAnnotationsModelMetadataProvider provider,Type containerType,Func<object> modelAccessor,Type modelType,string propertyName,DisplayColumnAttribute displayColumnAttribute);
            protected override string GetSimpleDisplayText();
        }

DataAnnotationsModelMetadataオブジェクトの場合、プロパティオブジェクトのDisplayColumnプロパティが現在のデータクラスで定義されているプロパティ名を返すと、対応するプロパティの値がGetSimpleDisplayTextの戻り値として返されます.
6.CachedDataAnnotationsModelMetadata
   ASP.NET MVCがデフォルトで提供するModelメタデータは、実はCachedDataAnnotationsModelMetadataクラスのオブジェクトであり、このクラスは上記のDataAnnotationsModelMetadataクラスのサブクラスではなく、CachedModelMetadataがそのベースクラスである.CachedModelMetadataベースクラスは、「プロトタイプ」設計モードを採用しています.つまり、その1つのコンストラクション関数には、プロトタイプとしてのCachedModelMetadataオブジェクトがもう1つ指定されますが、それ自体のいくつかの属性はプロトタイプオブジェクトとしての同名属性から来ています.このベースクラスは、Modelメタデータを記述するすべての属性を書き換え、対応する保護されたダミーメソッドを定義してそれらの値を導出し、ベースクラスに対応する属性値を直接返す.CachedDataAnnotationsModelMetadataは、Modelメタデータの属性を計算するために使用されるすべてのComputeXxxメソッド(すなわち、対応する保護されたダミーメソッド)を書き換える.Modelメタデータ情報をキャッシュするタイプとして、CachedDataAnnotationsMetadataAttributesはModelメタデータを定義するためのすべてのデータ注記特性を含み、CachedDataAnnotationsModelMetadataはCachedDataAnnotationsMetadataAttributesのカプセル化であり、前述したComputeXxx()メソッドの戻り値は、前にカプセル化されたオブジェクトに由来する.
7.ModelMetadataProvider
これは抽象クラスであり、以下に示すように、GetMetadataForPropertiesメソッドは、指定されたコンテナタイプのすべての属性を記述するModelメタデータのセットを取得するために使用される.GetMetadataForPropetyメソッドは、あるデバイスを記述するために使用されます.
        public class ModelMetadataProvider
        {
            protected ModelMetadataProvider();
            public abstract IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType);
            public abstract ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName);
            public abstract ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType);
        }

ボディ属性のModelメタデータ.GetMetadataForTypeメソッドは、コンテナオブジェクトとタイプのModelメタデータを直接返します.次に、3つの提供クラスを見てみましょう.
(1)A s o c i atedMetadataProvider:DataAnnotationsModelMetadataを提供するDataAnnotationsModelMetadataProviderおよびC h e d DataAnnotationsModelMetadataのC h e d DataAnnotationsModelMetadataは、いずれもAssociatedMetadataProviderのサブクラスである.このクラスは、データ型またはそのデータメンバーに関連付けられたプロパティに基づいてModelメタデータを解析し、関連付けられたすべてのプロパティリストに基づいてModelメタデータとしてModel Metadataオブジェクトを作成します.
(2)DataAnnotationsModelMetadataProvider:このクラスは実装されたCreateMetadataメソッドで、提供されたプロパティリストからDisplayColumnAttributeプロパティを抽出し、コンストラクション関数を呼び出してDataAnnotationsModelMetadataオブジェクトを作成し、提供されたデータ注釈プロパティを使用して初期化します.
(3)CachedAssociatedMetadataProvider:このクラスで書き換えられたCreateMetadataメソッドは、データ型と属性名(属性ベースのModelメタデータの場合)に基づいてkeyを生成し、ObjectCacheオブジェクトが示すキャッシュから予め作成されたModelMetadataオブジェクトを取得します.キャッシュされたModelMetadataオブジェクトが存在する場合、抽象メソッドCreateMetadataFormPrototypeが呼び出され、新しいModelMetadataオブジェクトが作成されます.存在しない場合は、元のModelMetadataオブジェクトとして作成されます.このオブジェクトは戻ってからキャッシュされます.
まとめ:ModelMetadataProviders、DataAnnotationsModelMetadataProvider、C a c h e d DataAnnotationsModelMetadataProviderはModelMetadataProviderを得る;
C a c h e d D a t a n o t i o n s M o delMetadataProvider DataAnnotationsModelMetadataProviderはModelMetadataを得ることができます.