我使用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完成所有操作,但我想根据一个单独的属性分配单独的验证器来处理其余的事情。非常感谢提前!
答案 0 :(得分:0)
虽然我完全没有意识到这一点,但我设法找到一个类似的解决方案,按照FluentValidation Call RuleSet and Common Rules的步骤完成工作。
此解决方案建议使用RuleSet并根据它们进行验证。关于它,有几点我不喜欢:
因此,虽然这个解决方案是可行的,但我仍然非常好奇地获得原始问题的输入,看看是否可以在FluentValidation中实现所提议的设计。