【问题标题】:FluentValidation, is possible an inline validation?FluentValidation,是否可以进行内联验证?
【发布时间】:2020-07-03 16:59:42
【问题描述】:

我有以下操作:

public void Save (Customer c, IEnumerable <Product> products)
{
    // Validate that you have entered at least one product.
    if (!produtos.Any())
        throw new ArgumentOutOfRangeException("products");
}

内联,不使用继承(例如 AbstractValidator ),与使用 FluentValidation 库的相同操作一样吗?

【问题讨论】:

    标签: c# validation fluentvalidation


    【解决方案1】:

    我认为这种验证是不可能的,如果您有一个具有IEnumerable&lt;Product&gt; 类型属性的对象,您可以使用FluentValidation 来检查该对象是否至少有一个产品。

    例如

    public class ProductList
    {
      IEnumerable<Product> Products {get;set;}
    
        var Validator = new ProductListValidator();
        public bool IsValid
        {
            get
            {
                var res = Validator.Validate(this);
                return res.IsValid;
            }
        }
    
        public IList<ValidationFailure> ValidationResult
        {
            get
            {
                var res = Validator.Validate(this);
                return res.Errors;
            }
        }
    }
    
       public class ProductListValidator : AbstractValidator<ProductList>
       {
          public ProductListValidator()
          {
              RuleFor(i => i.Products).Must(i => i.HasAny()).WithMessage("Your Error Meesage");
          }
    
       }
    

    然后

    public void Save (Customer c, ProductList products)
    {
        // Validate that you have entered at least one product.
        if (!ProductList.IsValid)
        {
            ReturnErrorSummary(ProductList.ValidationResult);
        }
    }
    

    【讨论】:

    【解决方案2】:

    目前尚不支持:

    public void DoOperation(List<string> strings)
    { 
        var validator = new InlineValidator<List<string>>();
        validator.RuleFor(l => l).Must(l => l.Any()).WithMessage("No one");
        validator.ValidateAndThrow(strings)     
    }
    

    在这种情况下,我们必须手动抛出 ValidationException。

    喜欢:

    public void DoOperation(List<string> strings)
    { 
        if (!strings.Any())
        {
            var failures = new List<ValidationFailure>();
            failures.Add(new ValidationFailure("strings", "Must have at less one."));
    
            throw new ValidationException(failures);
        }
    }
    

    见:

    https://fluentvalidation.codeplex.com/discussions/579227

    【讨论】:

      【解决方案3】:
      var validator = new InlineValidator<Person>();
      
      validator.RuleSet("SomeRuleset", ()=>{
        validator.RuleFor(x=>x.Name)...etc
      });
      

      https://github.com/FluentValidation/FluentValidation/issues/563

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2011-12-03
        • 2022-11-09
        • 1970-01-01
        • 2014-10-12
        • 2021-11-14
        相关资源
        最近更新 更多