Nenhum comentário Download


Validações e regras

Como comentamos anteriormente, a camada de negócio é a responsável pelas validações e regras que executa na camada de banco (Model). Isso facilita, pois precisamos codificar e fazer a manutenção em apenas um local.

Caso usássemos a camada de apresentação para isso, precisaríamos codificar as regras e validações na aplicação Web e desktop, ou seja, em cada tipo de camada de apresentação que usássemos, aumentando assim o trabalho de desenvolvimento.

Vamos implementar apenas um exemplo de como codificar regras e validações na camada de negócio. Alguns campos são obrigatórios nos cadastros. Vamos modificar (Listagem 4) o método Salvar da classe produto para verificar, se os campos obrigatórios estão preenchidos.

Listagem 4. Validando a obrigatoriedade do campo no Controller

using System;

...

public bool Salvar(bool Insert, PRODUTO objeto)

{

   if (string.IsNullOrEmpty(objeto.sNmProduto))

      throw new Exception("Campo Nome do Produto: preenchimento obrigatório.");

 

   if (objeto.nVlProduto <= 0)

      throw new Exception("Campo Valor do Produto: valor deve ser maior que zero.");

 

   return produto.Salvar(Insert, objeto);

}

Verificamos se o campo sNmProduto foi preenchido e invocamos uma exceção para ser tratada na camada de apresentação. Para o campo nVlProduto, verificamos se ele é maior que zero.

Nota: O Entity Framework possui a facilidade de usarmos o First Model e classes POCO, assim, utilizando marcação de atributos (Data Annotations), podemos criar esse tipo de regra/validação de forma mais simples.

Implementando a camada de apresentação

Bom, agora precisamos codificar a camada de apresentação. Qual usar? Web ou desktop? Independe, a escolha é sua. Uma ou as duas, podem ser utilizadas nesse exemplo. Vamos primeiramente, criar uma aplicação desktop e novamente, vamos usar Orientação a Objetos no exemplo.

Vamos usar herança visual de formulários para os cadastros. Será semelhante ao que fizemos com a classe base e as classes herdadas, com a diferença que teremos nesse caso, formulários. Caso tenha mais interesse sobre o assunto, veja a seção Links onde mostro em um artigo como fazer herança de formulários com Windows Forms.

Na Figura 5, temos o formulário base do cadastro.


Figura 5.
Formulário base de cadastro

Criaremos um formulário que será o cadastro de produtos. Após herdar o mesmo do formulário base, vamos codificar os métodos virtuais. Veja na Listagem 5 os métodos virtuais.

Listagem 5. Métodos implementados no cadastro de Produtos

public override void Pesquisar()

{

  List<PRODUTO> lista = objProduto.PesquisarTexto(txtPesquisa.Text);

   lvPesquisa.Items.Clear();

  foreach (PRODUTO produto in lista)

  {

    ListViewItem item = new ListViewItem(produto.nCdProduto.ToString());

    item.SubItems.Add(produto.sNmProduto);

     lvPesquisa.Items.Add(item);

  }

   lblMensagem.Text = lista.Count.ToString() + " registro(s) encontrado(s) com o texto '" + txtPesquisa.Text + "'";

}

 public override void PreencheControles()

{

  PRODUTO produto = objProduto.Pesquisar(_nCdCodigo);

   lblCodigo.Text = produto.nCdProduto.ToString();

  txtNomeProduto.Text = produto.sNmProduto;

  txtValor.Text = produto.nVlProduto.ToString();

  txtQuantidade.Text = produto.nQtdeMin.ToString();

  lblQtdeAtual.Text = produto.nQtdeAtual.ToString();

}

 public override bool Salvar()

{

  try

  {

    PRODUTO produto = new PRODUTO();

 

    if (scStatus == StatusCadastro.scEditar)

      produto.nCdProduto = Convert.ToInt32(lblCodigo.Text);

     produto.sNmProduto = txtNomeProduto.Text;

    produto.nVlProduto = Convert.ToDecimal(txtValor.Text);

    produto.nQtdeMin = Convert.ToDecimal(txtQuantidade.Text);

     return objProduto.Salvar(scStatus == StatusCadastro.scNovo, produto);

  }

  catch (Exception ex)

  {

    MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK,

      MessageBoxIcon.Error);

    return false;

  }

}

 public override bool Excluir()

{

  try

  {

    PRODUTO produto = new PRODUTO();

    produto.nCdProduto = Convert.ToInt32(lblCodigo.Text);

 

    return objProduto.Excluir(produto);

  }

  catch (Exception ex)

  {

    MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK,

      MessageBoxIcon.Error);

    return false;

  }

}

Como podemos ver, usamos os métodos do Business (Controller) que por sua vez, irá invocar os métodos do DataAccess (Model). O objProduto, é uma variável privada da classe que é instanciada no construtor do formulário.

O Pesquisar, realizada a pesquisa, usando o PesquisaTexto, preenche os dados retornados no ListView e exibe uma mensagem com a quantidade de registros retornados. O PreencheControles, apenas pesquisa pelo código do produto e preenche os controles de tela. A variável _nCdCodigo é do formulário base e é preenchido quando o usuário da um duplo clique no ListView para selecionar o registro.

No Salvar, preenchemos o objeto da entidade do modelo e passamos como parâmetro para realizar a inserção ou atualização. A scStatus indica se estamos inserindo ou atualizando um registro. O Excluir, também é bastante simples, onde apenas indicamos o valor do código do produto na entidade e passamos a mesma por parâmetro.

Nota: os métodos Salvar e Excluir possui um bloco try..catch para que possamos mostrar os erros ocorridos ou as mensagens de validação que implementamos.

Criei um formulário principal para chamar os formulários de cadastro da aplicação. Veja na Figura 6 o cadastro em execução.


Figura 6.
Aplicação desktop em execução

Criando o projeto Web

Agora, se precisarmos trocar a camada de apresentação? Web é a nossa possibilidade. Precisamos mudar muita coisa nas camadas de negócio e de dados? Eu diria, praticamente nada.

Nota: A plataforma Mobile tem características muito diferentes da Web e desktop, portanto, podemos usar esse exemplo e pode ser necessário algumas modificações.

Vamos usar o Visual Studio 2012 for Web. Assim, precisamos pegar as DLLs do projeto (Business e DataAccess) para usar nas referências. Caso você esteja usando a versão comercial do Visual Studio, pode criar a aplicação Web na própria Solution que tem o projeto desktop e library.

Dê o nome de “WebApp” para o projeto. Para adicionar a referência das DLLs, clique no item References e escolha Add Reference. No editor, clique em Browse e procure as DLLs do projeto. Após adicionar, basta usar o namespace Business e DataAccess onde for necessário, que teremos acesso as classes da camada de negócios (Controller) e as entidades (Model).

Para o cadastro, vamos criar uma página simples, para os produtos. Nesse exemplo, não implementaremos a pesquisa. Deixo como exercício para o leitor aumentar seus conhecimentos em aplicações ASP.NET J.

Veja na Figura 7 o cadastro de Produtos na app Web.


Figura 7.
Criando o cadastro no ASP.NET

Nota: não me atentei ao layout da aplicação e suas funcionalidades, pois o importante aqui é a utilização das classes criada anteriormente.

Veja na Listagem 6, o código dos métodos Salvar e Excluir.

Listagem 6. Métodos Salvar e Excluir

using DataAccess;

using Business;

...

protected void ImageButton2_Click(object sender, ImageClickEventArgs e)

{

  try

  {

    balProduto objProduto = new balProduto();

    PRODUTO produto = new PRODUTO();

    produto.nCdProduto = Convert.ToInt32(lblCodigo.Text);

    produto.sNmProduto = txtNomeProduto.Text;

    produto.nVlProduto = Convert.ToDecimal(txtValor.Text);

    produto.nQtdeMin = Convert.ToDecimal(txtQuantidade.Text);

    produto.nQtdeAtual = Convert.ToDecimal(lblQuantidade.Text);

    if (objProduto.Salvar(false, produto))

    {

      MessageBox1.ShowMessage("Registro salvo com sucesso.");

    }               

  }

  catch (Exception ex)

  {

    MessageBox1.ShowMessage(ex.Message);

  }

}

 

protected void ImageButton3_Click(object sender, ImageClickEventArgs e)

{

  try

  {

    balProduto objProduto = new balProduto();

    PRODUTO produto = new PRODUTO();

    produto.nCdProduto = Convert.ToInt32(lblCodigo.Text);

 

    if (objProduto.Excluir(produto))

    {

      MessageBox1.ShowMessage("Registro excluido com sucesso.");

    }

  }

  catch (Exception ex)

  {

    MessageBox1.ShowMessage(ex.Message);

  }

}

Utilizei o valor dos controles de tela para preenche o objeto e salvar ou excluir o registro. Em uma aplicação real, temos que usar outras facilidades, como variáveis de sessão etc. O código é muito parecido com a aplicação Windows Forms. Criamos uma instância do Produto, preenchemos suas propriedades e chamamos o método Salvar, passando a instância como parâmetro.

Como você deve ter notado, tanto na aplicação Windows, como na Web, o código esta dentro de um bloco try..catch. Isso ocorre, por que as validações, dentro do Business (Controller), gera exceções quando alguma regra ou validação é necessária.

Assim, na camada de apresentação que vamos mostrar para o usuário de maneira mais elegante, o erro ou mensagem de validação. Para Windows Forms, é simples, basta usar o MessageBox, que mostra caixas de mensagem ou confirmação, padrão do Windows. Para a Web, não temos um caixa de mensagem padrão.

Podemos contornar usando um controle Web desenvolvido para esse fim. Na seção Links temos um artigo sobre um controle web para trabalhar com caixas de mensagem e de confirmação no ASP.NET.

Veja na Figura 8, as duas aplicações, usando a mesma validação.


Figura 8.
Aplicações com a mesma validação

Note que a facilidade fica por conta que não precisarmos fazer a validação na camada de apresentação Web ou desktop. Essa validação esta no Controller e será mostrada independente de plataforma. Precisamos apenas saber como apresentar a mesma para o usuário de acordo com a plataforma usada.

Nota: tanto no projeto desktop, como Web é necessário ter no arquivo config a string de conexão do Entity Framework com o banco de dados (com o mesmo nome).

Conclusões

Vimos nesse artigo, uma dica interessante para criar aplicações Web ou Windows Forms, onde usamos o padrão de projetos MVC, para dividir a aplicação em camadas que podem conversar independente da plataforma usada, sem a necessidade de mudanças na sua estrutura e código.

Isso proporciona também uma fácil manutenção e podemos dizer, nas alterações que se fazem necessárias. Mas fica a dica de que usar o padrão MVC, não é recomendado para projetos muito pequenos, pois o tempo de análise pode ser grande, assim como sua equipe tem que ter um nível de experiência bem alto.

Um grande abraço a todos e até a próxima!

 

Links

ADO.NET Entity Framework
www.lucianopimenta.com/post.aspx?id=242

ADO.NET Entity Framework – Parte II
www.lucianopimenta.com/post.aspx?id=243

Herança visual de formulários no Windows Forms
www.lucianopimenta.com/post.aspx?id=193

Mensagens no ASP.NET
www.lucianopimenta.com/post.aspx?id=37