Às vezes, existem muitas regras de validação em nossos métodos, como o nome não pode ser nulo, a idade deve ser maior que 18, etc., e como de costume, podemos escrever algum código para definir essas regras:
static void Main(string[] args) { var addCusDto = new AddCustomerDto(); AddCustomer(addCusDto); Console.ReadKey(); } static void AddCustomer(AddCustomerDto dto) { if (string.IsNullOrWhiteSpace(dto.Name)) { Console.WriteLine($"name cannot be null"); return; } if (string.IsNullOrWhiteSpace(dto.Phone)) { Console.WriteLine($"phone cannot be null"); return; } if (dto.Other <= 0) { Console.WriteLine($"other must great than 0"); return; } //save code ... }
No entanto, este caminho parece não ser muito fácil de entender e/ou escrever. Aqui, apresentarei uma pequena biblioteca de validação chamada FluentValidation, que usa uma interface fluente e expressões lambda para criar as regras de validação.
Você pode seguir este link para mais informações: https://fluentvalidation.net/
Vamos dar uma olhada em como usar essa biblioteca. Antes da próxima seção, precisamos instalar o FluentValidation via NuGet.
Passo 1
Criando o validador.
Precisamos criar uma classe que herda de AbstractValidator <T>, onde T é o tipo de classe que você deseja validar. Para o exemplo de fundo, podemos criar o seguinte validador:
public class AddCustomerDtoValidator : AbstractValidator<AddCustomerDto> { public AddCustomerDtoValidator() { RuleFor(x => x.Name).NotEmpty().WithMessage("name cannot be null"); RuleFor(x => x.Phone).NotEmpty(); RuleFor(x => x.Other).GreaterThan(0).WithMessage("other must be great than 0"); } }
O que esse validador faz?
- A propriedade Name não está vazia. Se esta propriedade estiver vazia, a mensagem de erro será “nome não pode ser nulo”.
- A propriedade Phone não está vazia. Se esta propriedade estiver vazia, a mensagem de erro será o valor padrão.
- A propriedade Other deve ser maior que 0. Se essa propriedade não for maior que 0, a mensagem de erro será o valor padrão.
Passo 2
Usando o validador:
static void AddCustomerWithFluentValidation(AddCustomerDto dto) { var validator = new AddCustomerDtoValidator(); var validRes = validator.Validate(dto); if (!validRes.IsValid) { //first error message Console.WriteLine(validRes.Errors.FirstOrDefault()); //Console.WriteLine(validRes.Errors.FirstOrDefault().ErrorMessage); ////all error messages //Console.WriteLine(validRes.ToString(",")); //Console.WriteLine(string.Join(",", validRes.Errors.Select(x => x.ErrorMessage))); //Console.WriteLine(string.Join(",", validRes.Errors)); } //save code ... }
Como você pode ver, acabamos de criar uma instância do validador e chamamos o método de validação passando o objeto dto que queremos validar.
O método Validate retorna um objeto ValidationResult. Ele contém duas propriedades, uma é IsValid que diz se a validação foi bem-sucedida ou não, enquanto a outra é Erros, que contém os detalhes sobre quaisquer falhas de validação.
O exemplo acima mostra como obter a primeira mensagem de erro e todas as mensagens de erro. Você pode retornar a (s) mensagem (s) com base em sua necessidade. Nós só precisamos de dois passos para usar esta biblioteca.
Existem muitos recursos úteis do FluentValidation, como validadores encadeados:
RuleFor(x => x.Name) .NotEmpty() .NotEqual("catcher") .WithMessage("name cannot be null");
Assim, podemos combinar muitos validadores para uma propriedade ou um conjunto delas.
Um grande abraço a todos!