0

http://fluentvalidation.codeplex.com/を使用して検証ルールを特定のプロセスに結び付けるためのベストプラクティスは何でしょう

現在、「ルール セット」機能を使用して、ルールをさまざまなプロセスにグループ化しています。

 public class ObjAValidation: AbstractValidator<A>
    {
        public ObjAValidation()
        {
            RuleSet("ProcessA", () =>
            {
                RuleFor(x => ...);
                RuleFor(x => ...);
            }); 
           RuleSet("ProcessB", () =>
            {
                RuleFor(x => ...);
                RuleFor(x => ...);
            }); 
        }
    }

そして、次を使用して検証します。

var a = new A(){...};
IValidator<A> validator = new ObjAValidation();
var result = validator.Validate(a, ruleSet: "ProcessA");

このアプローチには 2 つの問題があります。

  1. プロセス名として文字列を使用するのは好きではありません。より強く型付けされたアプローチを使用したいと思います。たとえば、マーカー インターフェイスまたは属性を使用できるようにします。
  2. 私の単体テストでは、Moq でオプションの引数を使用できないため、IValidator の Validate メソッドをセットアップできません。


Mock<IValidator<A>> _mockValidator = new Mock<IValidator<A>>();
_mockValidator.Setup(x => x.Validate(new A(), ruleSet: "ProcessA"));
2 行目で実行時エラーが発生します。式ツリーに名前付き引数の仕様が含まれていない可能性があります。また、名前付き引数なしで ruleSet 引数を Validate メソッドに渡したい場合は、「IValidatorSelector セレクター」オブジェクトを提供する必要があります。しかし、このインターフェースは文書化されていません。

4

2 に答える 2

1

変数やデータ構造など、ハードコードされた文字列パラメーターの使用を防ぐために使用できるヘルパークラスを作成できない理由は何ですか?また、列挙型を使用する可能性を忘れないでください。

必要なカスタム機能も実装できるIValidatorを実装するクラスを作成できない理由は何ですか?

于 2012-06-12T09:51:54.017 に答える