À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!


