1


1

問題:

顧客が複数のデータレコードをアップロードするために使用できるWCF Webサービスがあります。 データを検証するには、Enterprise Library Validation Blockを使用します。 レコードは数層の深さにネストすることができます。

質問:

どのレコードで検証が失敗したかを識別する方法

例:

次のデータ構造を考えてください。 大陸ごとに複数の国があり、国ごとに複数の都市がある場合があります。

  • 大陸名前名前*市*名前**市長

市長の検証が失敗した場合、どの市、国、および地域で失敗したかを知りたいです。

2 Answer


1


私は次のようにして私の問題を解決しました:

WCF統合を設定します。

(Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF)

単純なマーカー属性を作成します。

パブリッククラスValidationKeyAttribute:Attribute {}

これはデータレコードを識別するPropertyに置かれます。

インタフェースを作成します。

パブリックインターフェイスIValidationBackReference {object BackReference {get;}セット; }}

これは、上記の例のCityレコードからCountryレコードへの参照であり、チェーンの上位にあるすべての識別子も含まれる

ValidationParameterInspector`の BeforeCall() `メソッドを修正します

すべての入力をクロールし、次のようなものを使って `BackReference`を設定します。

private void SearchForBackReferences(オブジェクト入力、オブジェクト逆参照){if(input == null){return; t = input.GetType();と入力します。 if(t.IsArray){Object []入力=(object [])入力。 SearchForBackReferences(入力、backReference);そうでなければ(入力はIValidationBackReference){foreach(PropertyInfo info in t.GetProperties()){object value = info.GetValue(input、null); SearchForBackReferences(value、input); ((IValidationBackReference)入力).BackReference = backReference; }}

プライベートvoid SearchForBackReferences(object []入力、オブジェクトbackReference){if(input == null){return; foreach(入力でのオブジェクト入力){SearchForBackReferences(input、backReference);} }}

ValidationParameterInspector`の CreateValidationDetail`メソッドを修正してください

このようなものでBackReferencesを経由してレコードツリーを上がるには

プライベート静的ストリングFindKey(オブジェクト・ターゲット){StringBuilder結果= new StringBuilder(); if(target == null){return result.ToString();} if(ターゲットはIValidationBackReference){result.Append(FindKey(((IValidationBackReference)target).BackReference)); t = target.GetType();と入力します。 foreach(t.GetProperties()内の変数情報){if(Attribute.IsDefined(info、typeof(ValidationKeyAttribute))){object objectValue = info.GetValue(target、null); string stringValue = "(null)"; if(objectValue!= null){stringValue = objectValue.ToString(); result.Append(string.Format( "{0} = '{1}';"、info.Name、stringValue));結果を返します。ToString(); }

そしてそれを ValidationKDetail`の Details.Key`に入れます。 これまでのところセットアップ。

'' '' '

Webサービスで

今しなければならないのは、Webサービスによって使用されるクラスに IValidationBackReference`インターフェースを実装し、適切なプロパティに [ValidationKey] `属性を置くことだけです。

上記の例は次のようになります。

パブリッククラスContinental:IValidationBackReference {public object BackReference {get;}セット; [ValidationKey]パブリック文字列Name {get;}セット; }

公開国[]国{ゲット;セット; }}

パブリッククラスCountry:IValidationBackReference {パブリックオブジェクトBackReference {get;}セット; [ValidationKey]パブリック文字列Name {get;}セット; }

公共の市[]都市{ゲット;セット; }}

パブリッククラスCity:IValidationBackReference {パブリックオブジェクトBackReference {get;}セット; [ValidationKey]パブリック文字列市長{get;}セット; }}

なんてモンスターなんだ…


0


オブジェクトツリーを上に戻って適切な検証エラーメッセージを生成するのに必要なロジックを含む独自のバリデータを書く必要があるかもしれません。 詳細についてはこの記事を見てください。