[英]FluentValidation - conditionally selecting a validator
我正在使用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來完成所有操作,但是我想基於一個單獨的屬性分配單獨的驗證器,以完成其余工作。 在此先多謝!
盡管我不能完全意識到這一點,但我還是按照FluentValidation調用RuleSet和通用規則中的步驟設法找到了一個類似的解決方案。
該解決方案建議使用規則集並基於它們進行驗證。 有一些我不喜歡的要點:
因此,盡管該解決方案可行,但我仍然非常想知道原始問題,以了解所提出的設計是否可以在FluentValidation中實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.