Usando o paradigma da orientação a objetos, deveria ser natural iniciar o desenvolvimento pelo modelo de entidades, onde as classes são definidas para representar o domínio do negócio.
Posteriormente, e a partir destas classes, seria gerado o banco de dados usado pela aplicação para realizar a persistência das informações.
A realidade não é bem assim. Na maioria das vezes vemos bancos de dados já projetados.
O Data Annotation
Para facilitar que as informações sejam inseridas corretamente, o pessoal do desenvolvimento utiliza quase 100% dos atributos Data Annotation — que foram introduzidos no .NET 3.5 como uma forma de adicionar a validação para as classes usadas por aplicações ASP.NET.
Como tudo na vida tende a evoluir, vamos comparar um pouco o Data Annotation com o FluentValidation, nos baseando na sua facilidade de criar códigos limpos (clean code) mas, principalmente na sua forma de tratamento das validações.
Cenário: Vamos imaginar uma view com diversos campos e, em um dado momento, o usuário submete para o servidor.
O Data Annotation define os requisitos das propriedades e validação das entidades e, caso haja algum erro, retorna o formulário para o usuário.
Até ai, beleza. Só que, a cada submissão, os erros são tratados um a um.
No FluentValidation isso não funciona, é criado um “dicionário de erros”, que só será submetido quando todos erros forem eliminados na view, assim não temos um vai e volta do servidor.
>>Leitura Recomendada:
Usando o MediatR com ASP.NET Core
O que é Fluent Validation?
Fluent Validation é uma biblioteca que veio para criar validações de dados de forma simples e rápida para os desenvolvedores.
Com ela, podemos usar expressões Lambda para “construir regras de validações” com retorno de mensagem de erro para cada propriedade das entidades.
Podemos criar projetos de teste (tenho no meu GitHub um exemplo) em que os retornos são legíveis.
Quando um projeto é 100% criado em Fluent Validation, o pessoal de teste tem muito menos afazeres pois o teste ocorre paralelamente ao desenvolvimento.
>>Leitura Recomendada:
Os 5 melhores frameworks de Python
Instalando Fluent Validation no ASP.NET CORE
Para habilitar a integração MVC, você precisará adicionar uma referência ao:
FluentValidation.AspNetCoreassembly
Instalando o pacote NuGet apropriado
Install-Package FluentValidation.AspNetCore
Depois de instalado, você precisará configurar o Fluent Validation na classe Startup do seu aplicativo chamando o AddFluentValidation, método de extensão dentro do ConfigureServices, método que requer a using FluentValidation.AspNetCore.
Este método deve ser chamado diretamente após a chamada AddMvc:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(setup => { //...mvc setup... }).AddFluentValidation(); }
Para que o ASP.NET descubra seus validadores, eles devem estar registrados na coleção de serviços.
Você pode fazer isso chamando o AddTransient, método para cada um dos seus validadores…
public void ConfigureServices(IServiceCollection services) { services.AddMvc(setup => { //...mvc setup... }).AddFluentValidation(); }
… Ou usando o AddFromAssemblyContaining, método para registrar automaticamente todos os validadores em uma montagem específica.
Isso encontrará automaticamente quaisquer tipos públicos não abstratos que herdam AbstractValidatore e estão registrados no contêiner (os genéricos abertos não são suportados).
services.AddMvc() .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<PersonValidator>());
Este exemplo supõe que o PersonValidator esteja definido para validar uma classe chamada Person:
public class Person { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public int Age { get; set; } } public class PersonValidator : AbstractValidator<Person> { public PersonValidator() { RuleFor(x => x.Id).NotNull(); RuleFor(x => x.Name).Length(0, 10); RuleFor(x => x.Email).EmailAddress(); RuleFor(x => x.Age).InclusiveBetween(18, 60); } }
E aqui está a visualização (view) correspondente (usando o Razor):
@model Person <div asp-validation-summary="ModelOnly"></div> <form asp-action="Create"> Id: <input asp-for="Id" /> <span asp-validation-for="Id"></span> <br /> Name: <input asp-for="Name" /> <span asp-validation-for="Name"></span> <br /> Email: <input asp-for="Email" /> <span asp-validation-for="Email"></span> <br /> Age: <input asp-for="Age" /> <span asp-validation-for="Age"></span> <br /><br /> <input type="submit" value="submtit" /> </form>
>>Leitura Recomendada:
Melhores linguagens de programação para devs iniciantes
Compatibilidade com a validação interna do ASP.NET
Por padrão, após a execução do Fluent Validation, qualquer outro provedor de validador também terá a chance de executar.
Isso significa que você pode misturar Fluent Validation com atributos Data Annotations (ou qualquer outra implementação do ASP.NET ModelValidatorProvider).
Se você deseja desativar esse comportamento para que Fluent Validation seja a única biblioteca de validação executada, defina o RunDefaultMvcValidationAfterFluentValidationExecutes como false na rotina de inicialização do aplicativo:
services.AddMvc().AddFluentValidation(fv => { fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false; });
Validação de propriedade filho implícita vs explícita
Ao validar gráficos de objetos complexos, por padrão, você deve especificar explicitamente quaisquer validadores filhos para propriedades complexas usando SetValidato (consulte a seção de validação de propriedades complexas no Fluent Validation)
Ao executar um aplicativo ASP.NET MVC, você também pode habilitar a validação implícita para propriedades filho.
Quando isso estiver ativado, em vez de precisar especificar validadores filhos usando SetValidator, a infraestrutura de validação do MVC tentará recursivamente encontrar validadores para cada propriedade.
Isso pode ser feito configurando ImplicitlyValidateChildProperties como true.
Observe que, se você habilitar esse comportamento, não deverá usar SetValidator para propriedades filho, ou o validador será executado duas vezes.
Por hoje foi isso, pessoal, espero que tenham gostado do conteúdo sobre Fluent Validation, qualquer dúvida me procurem nas redes sociais ou nos comentários do blog!
>>Leitura Recomendada:
Dicas de Carreira para Programadores .NET