2016-05-17 9 views
4

私はバリデータを持っていますが、私は検証ロジックの一部としていくつかのセッション変数を使用しようとしていますが、base.Requestは常にNULLに戻ります。私はラムダ関数に指示に従って追加しました。また、Fluent validation for request dtosセクションのヒントにIRequiresHttpRequestを使用すると言われていますが、AbstractValidatorクラスは既にIRequiresRequestを実装しているため、バリデーションのドキュメントは古くなっているようです。ServiceStack Validator - 要求が挿入されていません

これは私のコードです:

public class UpdateContact : IReturn<UpdateContactResponse> 
{ 
    public Guid Id { get; set; } 

    public string Reference { get; set; } 

    public string Notes { get; set; } 

    public List<Accounts> Accounts { get; set; } 
} 

public class UpdateContactResponse : ResponseBase 
{ 
    public Guid ContactId { get; set; } 
} 

public class UpdateContactValidator : AbstractValidator<UpdateContact> 
{ 
    public UpdateContactValidator(IValidator<AccountDetail> accountDetailValidator) 
    { 
     RuleSet(ApplyTo.Post | ApplyTo.Put,() => { 
      var session = base.Request.GetSession() as CustomAuthSession; 
      RuleFor(c => c.Reference).Must(x => !string.IsNullOrEmpty(x) && session.Region.GetCountry() == RegionCodes.AU); 
     }); 

     RuleFor(R => R.Accounts).SetCollectionValidator(accountDetailValidator); 
    } 
} 

は、私が欠けているものはありますか?

答えて

4

注入された依存関係へのアクセスはRuleFor()ラムダ内でのみ実行でき、RuleSet()の代理人はコンストラクタの初期化時に実行され、そのルールセットのルールを設定します。

ですから、RuleFor()ラムダ内にbase.Requestへのアクセスを変更する必要があります。

RuleSet(ApplyTo.Post | ApplyTo.Put,() => { 
    RuleFor(c => c.Reference) 
    .Must(x => !string.IsNullOrEmpty(x) && 
    (Request.GetSession() as CustomAuthSession).Region.GetCountry() == RegionCodes.AU); 
}); 
+0

ので、これはと行うにはないSS – Jeff

+1

@Jeffいやに固有の「実行順序」の知識の詳細ですリクエストパイプラインでは、依存関係が注入される前に 'RuleSet()'ラムダがコンストラクタで実行されます。適切に注入されたバリデータにアクセスできるバリデーションで 'RuleFor()'ラムダが実行されます。 – mythz

+1

ありがとうございますが、単一レベルの検証のために動作しますが、今では入れ子になったバリデータ 'RuleFor(R => R.Accounts).SetCollectionValidator(accountDetailValidator);を追加すると' accountDetailValidatorはRequestオブジェクトを解決していないようです。私はまた質問を更新しました。 – vonec

関連する問題