簡體   English   中英

FluentValidation-有條件地選擇驗證器

[英]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設計使用的方式)
  • 驗證規則不是完全分開的(所有規則都在同一個驗證器中,將它們分成幾部分的唯一事情是根據規則集對它們進行分組)
  • 選擇標准將單獨處理(我實現了一個特定的Validate函數,在其中執行通用規則和特定規則,然后手動分析選擇標准),而理想情況下,它可以作為設計中驗證的一部分來完成在原始問題中概述。

因此,盡管該解決方案可行,但我仍然非常想知道原始問題,以了解所提出的設計是否可以在FluentValidation中實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM