1

フレームワークが提供するデフォルトのリソース ファイル システムの代わりに、独自のローカリゼーション実装を使用したいと考えています。構成ファイルでバリデーターを構成する必要もあります。

私の問題は、ConfigurationValidatorFactory をインスタンス化した後で Validator オブジェクトにアクセスしてメッセージ テンプレートを変更する方法がわからないことです。次のように、オブジェクトのバリデーターを作成できます。

var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();

ですが、上記の「val」は GenericValidatorWrapper 型であり、「真のバリデーター」インスタンスにアクセスするためのプロパティはありません。

検証後、真の Validator インスタンスを確認できますが、テンプレート テキストを変更するには遅すぎます。最終的なメッセージ (制限値を含む) は既に作成されており、テンプレートを変更してもメッセージは再作成されません。

助言がありますか?

エンタープライズ ライブラリのバージョンは 5 です。

4

1 に答える 1

0

リフレクションを使用して、関心のあるバリデーターのプロパティを変更できる場合があります。しかし、それは本当に厄介で厄介です。

検証後に検証結果のメッセージ テキストを単純に置き換えたらどうなるでしょうか。

構成ファイル内のメッセージはプレースホルダー (NAME_INVALID_LENGTH など) である可能性があり、それを実際のテキストに置き換えることができます。

var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();

MyObj myObj = new MyObj();
myObj.Name = "Swiper McFoxy";

ValidationResults results = new ValidationResults();

foreach (ValidationResult result in val.Validate(myObj))
{
    results.AddResult(
        new ValidationResult(
            GetMessage<MyObj>(result.Message, new CultureInfo("en")),
            result.Target,
            result.Key,
            result.Tag,
            result.Validator,
            result.NestedValidationResults));
}

アップデート

OK、テンプレート テキストが必要な場合は、リフレクションを介して調べてみることができますが、それでも非常に面倒です。

あなたの要件 (構成ファイル、テンプレートの維持) を考えると、私がおそらく行うことは、それぞれが必要なテンプレート テキストを含む複数の構成ファイルを作成することです。

これはちょっとしたメンテナンスの悪夢なので、そのアイデアを次のように改良します。

  1. 構成ファイルValidations.xmlを作成し、テンプレート化されたテキストを配置する代わりに、メッセージごとに一意のプレースホルダーを使用します (例: NAME_INVALID_LENGTH ですが、より一意的です)。

  2. 次に、サポートしているロケールごとに、一意のプレースホルダーをロケール固有のテンプレート化されたテキストに置き換える小さなコード/ツールを作成します。そして、結果のファイルを OutDir の下のロケール固有のフォルダー (bin\debug\en-US\Validations.xml など) にコピーします。これは、.NET がサテライト アセンブリをデプロイする方法と似ているため、それほど大したことではありません。

  3. 上記のツールをビルド後のステップとして実行します。このツールは、ビルド中に報告されるように、見つからないプレースホルダーにフラグを立てることができます。これにより、プレースホルダーとテンプレート テキストの同期が維持されます。

  4. ロケール固有の構成ファイルを使用するようにコードを変更します。

    CultureInfo culture = new CultureInfo("en-us");
    var cfgSrc = new FileConfigurationSource(culture.Name + @"\Validations.xml");
    var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
    Validator val = factory.CreateValidator<MyObj>();
    

    ヘルパー メソッドの背後にあるカルチャ固有のコードを抽象化して、読みやすく、保守しやすくすることができます。例えばGetValidationConfigurationSource(culture)

于 2011-01-12T02:28:19.500 に答える