2015-12-14 56 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来实现。