Vinicius Gonçalves
Vinicius Gonçalves

Reputation: 2724

FluentValidation, is possible an inline validation?

I have a the following operation:

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

Inline, without using inheritance (eg AbstractValidator ), as would this same operation using the FluentValidation library?

Upvotes: 3

Views: 4095

Answers (3)

Maicon Heck
Maicon Heck

Reputation: 2377

var validator = new InlineValidator<Person>();

validator.RuleSet("SomeRuleset", ()=>{
  validator.RuleFor(x=>x.Name)...etc
});

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

Upvotes: 2

Vinicius Gon&#231;alves
Vinicius Gon&#231;alves

Reputation: 2724

This is not supported yet:

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)     
}

On this case, we have to throw ValidationException manually.

like:

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);
    }
}

See:

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

Upvotes: 2

Reza
Reza

Reputation: 19923

I think this kind of validation is impossible, if you had an object which had a property of type IEnumerable<Product> you could using FluentValidation to check if the object has at least one product.

for example

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");
      }

   }

then

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

Upvotes: 1

Related Questions