FluentValidation - 有条件地选择验证器

时间:2015-12-14 17:25:35

标签: c# .net fluentvalidation

我使用FluentValidation(C#)来实现复杂对象的验证。我的问题是,我希望在给定对象的特定属性的情况下为完整对象选择不同的验证器。

假设以下结构:

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

在这个对象上,如果SelectionCriteria为true,我想使用Validator1;如果SelectionCriteria为false,我想使用Validator2。 很明显,验证器可以嵌套用于特定属性,但在这里我想为完整类选择验证器。在我看来是这样的事情:

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调用该函数。 你能否告诉你应该如何以正确的方式完成这项工作?同样,我可以使用属性验证器和When-s完成所有操作,但我想根据一个单独的属性分配单独的验证器来处理其余的事情。非常感谢提前!

1 个答案:

答案 0 :(得分:0)

虽然我完全没有意识到这一点,但我设法找到一个类似的解决方案,按照FluentValidation Call RuleSet and Common Rules的步骤完成工作。

此解决方案建议使用RuleSet并根据它们进行验证。关于它,有几点我不喜欢:

  • &#39;普通&#39;和特定的&#39;验证结果必须合并(这可能不是FluentValidation设计使用的方式)
  • 验证规则并不是完全分开的(所有规则都在同一个验证器中,唯一将它们分成几部分的是根据规则集对它们进行分组)
  • 选择标准将单独处理(我实施了一个特定的验证功能,其中执行了通用和特定规则,另外还有手动分析选择标准),理想情况下,它可以作为验证的一部分来完成在原始问题中概述的设计中。

因此,虽然这个解决方案是可行的,但我仍然非常好奇地获得原始问题的输入,看看是否可以在FluentValidation中实现所提议的设计。