2015-12-14 131 views
0

我使用FluentValidation(C#),以實現一個複雜的對象的驗證。我的問題是,我想爲給定對象的特定屬性的完整對象選擇不同的驗證器。FluentValidation - 有條件選擇一個驗證

假設以下結構:

public class MyComplexClass 
{ 
    public string OneProperty; 
    public string OtherProperty; 
    public bool SelectionCriteria 
} 

在這個對象,我想用Validator1如果SelectionCriteria是真實的,如果Validator2 SelectionCriteria是假的。 顯然,驗證可以嵌套的具體性能,但在這裏我想選擇的完整一流的驗證。在我的腦海裏有這樣的東西:

public MyComplexClassValidator : AbstractValidator_MyComplexClass_ 
{ 
    public MyComplexClassValidator() 
    { 
    AddRule(new ConditionValidationAssignmentRule(new MyComplexClassValidator1,x=>x.SelectionCriteria)) 
    AddRule(new ConditionValidationAssignmentRule(new MyComplexClassValidator1,x=>!x.SelectionCriteria)) 

    } 
} 

class ConditionalValidatorAssignmentRule : IValidationRule 
{ 
    public string RuleSet 
    { 
     get; set; 
    } 

    public IEnumerable<IPropertyValidator> Validators 
    { 
     get 
     { 
      yield break; 
     } 
    } 

    private IValidator _AssignedValidator; 
    private bool _ExecuteValidation = false; 
    private Func<string, bool> _Condition; 

    public ConditionalValidatorAssignmentRule(IValidator validator, Func<string,bool> condition) 
    { 
     _AssignedValidator = validator; 
     _Condition = condition; 
    } 

    public void ApplyCondition(Func<object, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) 
    { 
     throw new NotImplementedException(); 
    } 

    public IEnumerable<ValidationFailure> Validate(ValidationContext context) 
    { 

     var ret = new List<FluentValidation.Results.ValidationFailure>(); 
     ret.AddRange(_AssignedValidator.Validate(context).Errors); 
     return ret; 
    } 
} 

不幸的是我沒有設法用SelectionCriteria調用該函數。 您能否建議如何以正確的方式完成這項工作?同樣,我可以做這一切與財產驗證和當-S,但我想分配基於一個單獨的屬性來照顧其餘的獨立驗證。提前感謝!

回答

0

雖然我不能意識到這完全是,我設法在FluentValidation Call RuleSet and Common Rules該做這項工作要弄清楚以下的步驟類似的解決方案。

這種解決方案意味着規則集的使用和驗證基於他們。有一個關於它的幾個點,我不喜歡:

  • 「共同」和「具體的」驗證結果都將被合併(這可能不是FluentValidation設計使用的方式)
  • 驗證規則不是完全分開的(所有的規則都在同一個驗證器中,唯一將它們分開的部分是它們按照規則集進行分組)
  • 選擇標準將單獨處理(我實現了一個具體驗證功能,其中,所述共同的和具體的規則被執行時,再加上有選擇標準是手動分析的),而理想地它可以如在DESIG驗證的一部分來完成在原始問題中列出。

所以,儘管這個方案是可行的,我還是會很好奇地得到原來的問題輸入,看是否提出的設計可以在FluentValidation來實現。