none
Dúvida sobre Implementação de Regras de Negócio e Validações na camada BLL - C# RRS feed

  • Pergunta

  • Olá amigos do fórum!

    Já pesquisei em quase todos os fóruns e tutoriais na net, mas não encontro resposta para um minha dúvida sobre como implementar validações na camada BLL. Pelos exemplos que encontrei, as validações ocorrem na camada BLLmesmo com auxílio do Throw new Exception... Imagine que tivesse que Gravar uma Pessoa e o campo Cidade tivesse que ser obrigatório, caso o usuário não o passe, estoura um erro de exception na tela Horrível e sem tratamento de botões... O usuário pode se confundir e até encerrar a aplicação... Não achei interessante validar assim... Não acho funcional!

     public class PessoaFisicaBLL
        {
            private readonly DAL.Repositoy.PessoaFisicaRepository _PessoaFisicaRepository = new DAL.Repositoy.PessoaFisicaRepository();
    
            public String Salvar(PessoaFisicaDTO pPessoaFisicaDTO)
            {
                if (String.IsNullOrEmpty(pPessoaFisicaDTO.NomeCompleto))
                {
                    throw new Exception("O Campo Nome Completo deve ser preenchido.");
                }
                if (pPessoaFisicaDTO.NomeCompleto.Length > 100)
                {
                    throw new Exception("O Campo Nome Completo deve conter no máximo 100 caracteres.");
                }
                if (pPessoaFisicaDTO.Pessoa.Regiao.IDCidade <= 0)
                {
                    throw new Exception("O Campo ID Região deve ser informado.");
                }
                if (pPessoaFisicaDTO.Pessoa.PessoaTipo.IDPessoaTipo < 0)
                {
                    throw new Exception("O Campo Tipo Pessoa deve ser informado.");
                }
                if (pPessoaFisicaDTO.Pessoa.PessoaSituacao.IDPessoaSituacao < 0)
                {
                    throw new Exception("o campo situação pessoa deve ser informado.");
                }
                if (pPessoaFisicaDTO.Sexo.IDSexo < 0)
                {
                    throw new Exception("O Campo Sexo deve ser informado.");
                }
    
                return _PessoaFisicaRepository.Salvar(pPessoaFisicaDTO);
            }
    }

    Não tem uma forma mais agradável de retornar um messageBox  agradável ao usuário e não prosseguir enquanto ele não corrigir o problema, em vez de gerar uma exception horrorosa e nada funcional?

    Me desculpem, sou leigo no assunto e gostaria muito de aprender e compartilhar ideias... Alguém sabe como me ajudar?

    Abraço!!

    quinta-feira, 10 de dezembro de 2015 17:49

Respostas

  • Você tem muita razão, essa parte é a pior ao meu ver!

    Você pode usar desse link: https://github.com/netdragoon/ddd-validation as classes de validação que acredito ser melhor ... em vez desse monte e ifs ai você só vai fazer assim com auxilio dessa classe:

    public String Salvar(PessoaFisicaDTO pPessoaFisicaDTO)
    {
          	AssertionConcern.AssertArgumentNotEmpty(pPessoaFisicaDTO.NomeCompleto, "O Campo Nome Completo deve ser preenchido."));
    	AssertionConcern.AssertArgumentLength(pPessoaFisicaDTO.NomeCompleto, 1, 100, "O Campo Nome Completo deve conter no máximo 100 caracteres."));		
    	....... // assim por diante 
    	return _PessoaFisicaRepository.Salvar(pPessoaFisicaDTO);
    }

    Se ele não der nenhum throw é porque foi salvo, mas, se der você trata isso:

    try {
    
    PessoaFisicaBLL bll = new PessoaFisicaBLL();
    
    bll.save( ... );
    
    } catch(Exception ex) {
    
    //Messagem aqui ....
    
    }


    Fulvio C



    segunda-feira, 14 de dezembro de 2015 20:01

Todas as Respostas

  • Você tem muita razão, essa parte é a pior ao meu ver!

    Você pode usar desse link: https://github.com/netdragoon/ddd-validation as classes de validação que acredito ser melhor ... em vez desse monte e ifs ai você só vai fazer assim com auxilio dessa classe:

    public String Salvar(PessoaFisicaDTO pPessoaFisicaDTO)
    {
          	AssertionConcern.AssertArgumentNotEmpty(pPessoaFisicaDTO.NomeCompleto, "O Campo Nome Completo deve ser preenchido."));
    	AssertionConcern.AssertArgumentLength(pPessoaFisicaDTO.NomeCompleto, 1, 100, "O Campo Nome Completo deve conter no máximo 100 caracteres."));		
    	....... // assim por diante 
    	return _PessoaFisicaRepository.Salvar(pPessoaFisicaDTO);
    }

    Se ele não der nenhum throw é porque foi salvo, mas, se der você trata isso:

    try {
    
    PessoaFisicaBLL bll = new PessoaFisicaBLL();
    
    bll.save( ... );
    
    } catch(Exception ex) {
    
    //Messagem aqui ....
    
    }


    Fulvio C



    segunda-feira, 14 de dezembro de 2015 20:01
  • Obrigado Fulvio!!!

    Ótima dica cara... Vou aprofundar mais no assunto.... :)

    terça-feira, 15 de dezembro de 2015 14:55