1

IDataErrorInfoインターフェイスを使用してエンティティを検証しています。検証ロジックが属性からメタデータを読み取っている限り、それはすべてのエンティティで同じであるため、クラスを作成しました

public class DataErrorInfo : IDataErrorInfo

そして、すべてのエンティティはそれから派生しています。つまり、検証を高速化するために派生クラスのリフレクション情報をキャッシュしたいので、すべてのエンティティタイプは、実行中のアプリケーションごとに1回このキャッシュを初期化する必要があります。

フィールドを使用することを考えてstatic readonlyいましたが、最初に使用されたエンティティタイプのリフレクション情報で初期化されることがわかりました。したがって、エンティティAとエンティティBがあり、エンティティAが最初にアクセスされると、エンティティBにはエンティティAリフレクションキャッシュがあります。

4

2 に答える 2

2

Dictionary<Type, DataErrorInfo>実装されたものをシングルトンとして使用できます。

シングルトンパターンDictionaryは、メモリに1つだけ存在することを強制します。それDictionary自体は、各タイプが1つのエントリをとして取得するという制約を適用しますKeyValueキャッシュしたいリフレクション情報は何でもかまいません。この場合、それはのように見えDataErrorInfoます。

于 2012-06-29T10:36:28.733 に答える
1

ジェネリッククラスでは、静的なものがある場合、それは閉じたジェネリック型用であり、これを活用できます。基本クラスをジェネリックとして定義します(多少奇妙に見えますが、有効な制約があります)

public class DataErrorInfo<T> : IDataErrorInfo where T : DataErrorInfo<T>{
...
}

次に、派生クラスを次のように定義します(派生クラス自体がTとして基本ジェネリック型に渡されることに注意してください)

public class EntityClass : DataErrorInfo<EntityClass>{
...
}

そうすれば、以下のようにしない限り、静的は親クラスではなく派生クラスにスコープされます。

public class AnotherEntityClass : DataErrorInfo<EntityClass>{
...
}
于 2012-06-29T10:41:58.373 に答える