none
Validações de Campos Obrigatórios: Na DAL ou na BLL (Entity Code First) RRS feed

  • Pergunta

  • Estou começando um sistema bem simples de cadastros para aprender mais sobre Entity Framework com Code First.

    A minha dúvida é referente as boas práticas de programação quanto a validação de campos obrigatórios e seus limites de tamanho. É recomendável fazer essas validações na DAL ou na BLL?

    Hoje estou fazendo na DAL desta forma:

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace DTO.SubCadastros
    {
        class Endereco
        {
            /// <summary>
            /// 
            /// </summary>
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int EnderecoID     { get; set; }
    
            public int Tp_Entrega     { get; set; }
            public int Tp_Comercial   { get; set; }
            public int Tp_Faturamento { get; set; }
            public int Tp_Residencial { get; set; }
    
            [Required(ErrorMessage = "A Descrição é obrigatória")]
            [MaxLength(60), StringLength(60, ErrorMessage = "A Descrição pode ter no máximo {1} caracteres")]
            public string Descricao { get; set; }
    
            [Required(ErrorMessage = "O CEP é obrigatório")]
            [MaxLength(9), StringLength(9, ErrorMessage = "O CEP pode ter no máximo {1} caracteres")]
            public string CEP { get; set; }
    
            [Required(ErrorMessage = "O Logradouro é obrigatório")]
            [MaxLength(30), StringLength(30, ErrorMessage = "O CEP pode ter no máximo {1} caracteres")]
            public string Logradouro  { get; set; }
    
            [Required(ErrorMessage = "O Nome é obrigatório")]
            [MaxLength(60), StringLength(60, ErrorMessage = "O Nome pode ter no máximo {1} caracteres")]
            public string Nome        { get; set; }
    
            [MaxLength(40)]
            public string Complemento { get; set; }
    
            [MaxLength(40)]
            public string Referencia  { get; set; }
    
            [Required(ErrorMessage = "O Bairro é obrigatório")]
            [MaxLength(60), StringLength(60, ErrorMessage = "O Nome pode ter no máximo {1} caracteres")]
            public string Bairro      { get; set; }
    
            [Required(ErrorMessage = "A Cidade é obrigatória")]
            [MaxLength(60), StringLength(60, ErrorMessage = "A Cidade pode ter no máximo {1} caracteres")]
            public string Cidade      { get; set; }
    
            [Required(ErrorMessage = "O UF é obrigatório")]
            [MaxLength(2), StringLength(2, ErrorMessage = "O UF pode ter no máximo {1} caracteres")]
            public string UF          { get; set; }
        }
    }
    

    Caso esta não seja a melhor forma, qual seria?


    A inteligência é inata, mas a sabedoria se aprende.

    terça-feira, 27 de fevereiro de 2018 13:26

Respostas

  • Olá Fernando, a resposta do colega Edson, é umas das alternativas mais aplicadas na estrutura do MVC, porém acredito que a sua dúvida seja a nível geral de desenvolvimento, e essa resposta é Depende.

    1. Caso você esteja usando um Serviço (qualquer um), você deve realizar essas validações tanto na camada de apresentação quanto na de serviço (existem API que realizam isso para você de uma maneira prática) quanto na camada de negócio, mas isso depende muito da arquitetura do seu projeto.

    2. Se a sua aplicação não utiliza Serviço você pode aplicar as validações tanto na camada de negócio (BLL) quanto na CLASSE de OBJETOS (os famosos public string nomedoobjeto { get; set; }), pois nele você pode automaticamente realizar a validação do tipo de dado que está recebendo, e sendo assim "poupando" a execução de mais uma classe sem a necessidade.

    De uma maneira geral o correto é primeiro ver a arquitetura do seu projeto para escolher as várias hipóteses de validação, mas acima de tudo como o Edson disse sempre poupe trabalho, pois para realizar a manutenção ou atualização de código que possui muitas camadas ou vários locais de validação pode dificultar as coisas.

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Fernando Fonte quinta-feira, 1 de março de 2018 18:57
    quarta-feira, 28 de fevereiro de 2018 01:40
  • Olá Fernando,

    primeiramente relaxa, você está no caminho certo.....segundo, como você tem uma camada de DTO e nela você colocou os DataAnnotations, você realizou aquilo que eu descrevi anteriormente de realizar as validações na classe do objeto (public string nomedoobjeto { get; set; }), e isso já funciona muito bem, dispensando o uso de validação na DAL e utilizando esta camada somente para o CRUD.

    O que você pode fazer caso queira seria colocar na camada BLL uma classe para CONVERTER OS DADOS DA TELA (independente do tipo de projeto Win ou Web para o DTO ou caso futuramente você use o ENTITY FRAMEWORK) ex;

    public List<SubCadastroDTO> ConverterDadosParaDTO (CadastroDTO dados)

    {

    try

    {

    List<SubCadastroDTO> tabela = new  List<SubCadastroDTO>();

    tabela.Idade = Convert.ToInt16(dados.Idade);

    return tabela;

    }

    catch(Exception)

    {

    //manipulação do erro

    }

    }

    Se estiver com dúvida pergunte sempre!

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    quarta-feira, 28 de fevereiro de 2018 13:31

Todas as Respostas

  • Olá amigo,

    Um dos principais princípios do ASP.NET MVC é o DRY(Do not repeat yourself), ou seja, a ideia é que vc escreva apenas uma vez o código, reduzindo os erros e facilitando a manutenção do aplicativo. Assim o suporte de validação fornecido pelo ASP.NET VMC através de atributos é um excelente exemplo de DRY. 

    Espero ter ajudado!



    • Editado Edson Loris terça-feira, 27 de fevereiro de 2018 14:13
    terça-feira, 27 de fevereiro de 2018 14:12
  • Olá Fernando, a resposta do colega Edson, é umas das alternativas mais aplicadas na estrutura do MVC, porém acredito que a sua dúvida seja a nível geral de desenvolvimento, e essa resposta é Depende.

    1. Caso você esteja usando um Serviço (qualquer um), você deve realizar essas validações tanto na camada de apresentação quanto na de serviço (existem API que realizam isso para você de uma maneira prática) quanto na camada de negócio, mas isso depende muito da arquitetura do seu projeto.

    2. Se a sua aplicação não utiliza Serviço você pode aplicar as validações tanto na camada de negócio (BLL) quanto na CLASSE de OBJETOS (os famosos public string nomedoobjeto { get; set; }), pois nele você pode automaticamente realizar a validação do tipo de dado que está recebendo, e sendo assim "poupando" a execução de mais uma classe sem a necessidade.

    De uma maneira geral o correto é primeiro ver a arquitetura do seu projeto para escolher as várias hipóteses de validação, mas acima de tudo como o Edson disse sempre poupe trabalho, pois para realizar a manutenção ou atualização de código que possui muitas camadas ou vários locais de validação pode dificultar as coisas.

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Fernando Fonte quinta-feira, 1 de março de 2018 18:57
    quarta-feira, 28 de fevereiro de 2018 01:40
  • Oi Leandro. Sou novo no mundo do C#, especialmente OO pois venho da programação estruturada VB6/Delphi, então ainda não entendo todos os padrões, siglas, etc. Estou no aprendizado solo e na tentativa de acerto e erro.

    Baseado no que andei pesquisando, montei a estrutura do meu projeto da seguinte forma:

    Primeiramente vou fazer só 1 cadastro de Pessoa para aprender o fluxo entre as camadas, terminando na Desktop em Windows Forms. Depois vou tentar expandir a UI em uma versão Web.

    Então sobre as validações, pensei em fazer as básicas (nível de tabelas) do BD (Tamanho, Campo Obrigatório, etc) na camada DAL e na BLL, as regras diversas como Validação de CPF/CNPJ, Endereço de Email, etc.

    No geral, como estou bem no começo, ainda escrevendo as classes dos objetos (cadastros e subcadastros), aceito qualquer sugestão ou dica sobre o projeto como um todo.

    Obrigado!


    A inteligência é inata, mas a sabedoria se aprende.

    quarta-feira, 28 de fevereiro de 2018 13:10
  • Olá Fernando,

    primeiramente relaxa, você está no caminho certo.....segundo, como você tem uma camada de DTO e nela você colocou os DataAnnotations, você realizou aquilo que eu descrevi anteriormente de realizar as validações na classe do objeto (public string nomedoobjeto { get; set; }), e isso já funciona muito bem, dispensando o uso de validação na DAL e utilizando esta camada somente para o CRUD.

    O que você pode fazer caso queira seria colocar na camada BLL uma classe para CONVERTER OS DADOS DA TELA (independente do tipo de projeto Win ou Web para o DTO ou caso futuramente você use o ENTITY FRAMEWORK) ex;

    public List<SubCadastroDTO> ConverterDadosParaDTO (CadastroDTO dados)

    {

    try

    {

    List<SubCadastroDTO> tabela = new  List<SubCadastroDTO>();

    tabela.Idade = Convert.ToInt16(dados.Idade);

    return tabela;

    }

    catch(Exception)

    {

    //manipulação do erro

    }

    }

    Se estiver com dúvida pergunte sempre!

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    quarta-feira, 28 de fevereiro de 2018 13:31