2

検証エラーを表すクラスを実装しようとしています。このクラスには、ユーザーに表示するデフォルトのメッセージである Message という文字列値が必ず含まれます。また、検証エラーが何であるかをプログラマーに示す方法も必要です。特定の検証エラーが発生したかどうかを判断する簡単な方法が必要であるという考えです。

Type という文字列メンバーを実装するのは簡単ですが、ValidationError がその型であるかどうかを判断するには、その型を説明する文字列を覚えておく必要があります。

if (validationError.Type == "PersonWithoutSurname") DoSomething();

明らかに、もっと強く型付けされたものが必要です。列挙は良いでしょう:

if (validationError.Type == ValidationErrorType.PersonWithoutSurname) DoSomething();

しかし、数百種類の検証エラーが発生する可能性があるため、数百の値を持つ見苦しい列挙型になってしまう可能性があります。

サブクラス化を使用することも思い浮かびました。

if (validationError.GetType() == typeof(PersonWithoutSurnameValidationError)) DoSomething();

しかし、私のクラス ライブラリには何百ものクラスが散らばっており、ほとんどの場合、それぞれ一度しか使用されません。

あなたたちは何をしますか?この種のことで何時間も苦しんで過ごすことができます。

私が使用する提案を思いついた人に答えてください。列挙型の提案は打ち負かすものです。

4

3 に答える 3

3

私はFluentValidationを使用します。ここでは、各プロパティのデフォルトまたはカスタマイズ可能なメッセージを使用して、各クラスのルールを設定できます。

これは流暢なフレームワークであるため、次のようなルールを組み合わせることができます。

RuleFor(customer => customer.Address)
   .NotNull().Length(20, 250).Contains("Redmond")
   .WithMessage(@"Address is required, it must contain 
    the word Redmond and must be between 20 and 250 characters in length.");

Customer クラスのバリデーターの一般的な使用法:

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Company).NotNull();
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;  
//Bind these error messages to control to give validation feedback to user; 
于 2010-07-29T15:56:19.990 に答える
0

どうしてそんなに面倒なことをするのか、本当に理解できません....

あなたが行っている検証フィールドの場合、通常、正規表現バリデーターと必須フィールドバリデーターを追加します。一部のフィールドでは、独自のルール セットにカスタム バリデータを追加しています。しかし、それだけです。サーバー側だけでなく、クライアント側にも。その後、 page.validate コマンドを実行するだけで、エラーがスローされた場合、クライアントスクリプトが変更されたことを意味し、通常は応答としてページをリロードします。

また、チェックを単一の値に処理したい場合は、使用します

 System.Text.RegularExpressions.Regex.IsMatch(...

それで、これにはもっとありますか?? ありましたらご指摘ください。

于 2010-07-29T16:01:13.240 に答える
-1

質問がタイプを保存することである場合(特に新しいタイプを追加できるようにするため)、XMLの構成ファイル、またはデータベース駆動の何かはどうですか?

app.config を使用すると、次のことができます。

コードで呼び出されるのは次のとおりです。

//Generate the error somehow:
Validation.ErrorType = 
    ConfigurationManager.AppSettings["PersonWithoutSurnameValidationError"].Value;

//Handle the error
[Your string solution here]

このようにして、エラーの種類をコード外のどこかに文書化して覚えやすくします。一方、主な質問がストレージであり、処理する正しい型を取得できる場合は、列挙型に固執してください。

于 2010-07-29T16:00:51.793 に答える