 VB .NET - Criando uma 
aplicação em camadas (de novo) IV
  
VB .NET - Criando uma 
aplicação em camadas (de novo) IV
Continuando o artigo VB .NET - Criando uma aplicação em camadas (de novo) vou definir neste artigo a camada de apresentação ou interface com o usuário, que no nosso exemplo será uma aplicação Windows Forms. Lembre-se que já criamos as camadas físicas(um projeto para cada camada) e criarmos o projeto EstudanteMatricula para conter a nossa camada de apresentação conforme a figura abaixo:
|  | Nossa aplicação 
    é composta dos seguintes projetos: - A solução AplicacaoTresCamadas - O projeto BusinessLogicLayer (BLL) - O projeto DataAccessLayer (DAL) - O projeto EstudanteMatricula (UI) | 
A aplicação Windows Forms terá como objetivo principal registrar a matricula dos alunos em um determinado curso e será composta pelos seguintes formulários:
O formulário principal da aplicação é o formulário frmMain, e, abaixo eu estou exibindo a estrutura dos eventos e métodos usados neste formulário destacando as referências às classes da camada de negócios : Imports BusinessLogicLayer.BLL.Cursos e Imports BusinessLogicLayer.BLL.Estudantes
Se você espiar as classes definidas verá que a classe BLLCurso possui uma referência a camada de acesso a dados, especificamente a classe DALCurso : Imports DataAccessLayer.DAL.Curso
A mesma coisa ocorre com a classe BLLEstudantes que possui uma referência a classe DALEstudante : Imports DataAccessLayer.DAL.Estudantes
|  | 
Eu não vou detalhar o código pois tomaria muito espaço mas é importante frisar que na camada de apresentação sempre teremos uma chamada a camada de negócios que por sua vez faz uma chamada a camada de acesso a dados quando necessário. Para ilustrar vou mostrar o código do evento Click do botão Deletar:
| Private 
    Sub BtnDeletar_Click(ByVal 
    sender As 
    System.Object, ByVal 
    e As 
    System.EventArgs) Handles 
    BtnDeletar.Click 
 Me.Cursor = Cursors.WaitCursor Try _retvalor =False _objs = New BLLEstudantes() 'chama o método ExcluiEstudante da camada de negócios - BLLEstudantes _retvalor = _objs.ExcluiEstudante(txtProcurar.Text.Trim()) 
 'valida a exclusão If _retvalor = True Then MessageBox.Show("Estudante excluido com sucesso.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information) BtnResetar_Click(sender, e) Else MessageBox.Show("Erro a excluir o estudante.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) End If Catch ex As Exception MessageBox.Show(ex.Message,Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Finally _objs =Nothing End Try Me.Cursor = Cursors.Default End Sub | 
Observe as linhas de código em destaque.
A primeira linha cria uma instância da classe BLLEstudantes e na segunda linha estamos usando o método ExcluiEstudante() passando o código do estudante informado em txtProcurar.Text;
Olhando o método ExcluiEstudante na classe BLLEstudante temos:
| Public 
    Function 
    ExcluiEstudante(ByVal 
    EstudanteID As
    String) 
    As 
    Boolean _retvalor =False Try _obj = New DALEstudantes() _retvalor = _obj.ExcluiEstudante(EstudanteID) Catch ex As Exception Throw ex Finally _obj = Nothing End Try Return _retvalor End Function | 
Note que estamos criando uma instância da classe DALEstudantes na camada de acesso a dados e usando o seu método ExluiEstudante();
Então vamos espiar o método ExcluiEstudante() da classe DALEstudantes:
Note que ele usa objetos para acesso a dados , comandos SQL e controle de transação e que irá retornar um valor boleano True ou False.
Quem fez a chamada do método não precisa saber como será feita a exclusão só precisa saber se deu certo (true) ou não(false).
| Public 
    Function 
    ExcluiEstudante(ByVal 
    EstudanteID As
    String) 
    As 
    Boolean 
 _retvalor =False Try _olecon =New OleDb.OleDbConnection(_conStr) _olecon.Open() _transacao = _olecon.BeginTransaction(IsolationLevel.ReadCommitted) _olecom =New OleDb.OleDbCommand() 
 With _olecom .Connection = _olecon .CommandType = CommandType.Text .CommandText = "DELETE FROM Estudantes WHERE EstudanteID=@EstudanteID" .Parameters.Add("@EstudanteID", OleDbType.VarChar, 5).Value = EstudanteID.Trim() .Transaction = _transacao .ExecuteNonQuery() .Parameters.Clear() End With 
 _transacao.Commit() _retvalor =True Catch ex As Exception _transacao.Rollback() Throw ex Finally liberaTodosObjetos()End Try Return _retvalor End Function | 
Percebeu que cada camada e cada classe possui um papel e uma responsabilidade bem definida e que não existe uma chamada direta entre a camada de apresentação e a camada de acesso a dados ? Dessa forma somente a camada de acesso a dados sabe como acessar os dados e somente a camada de negócios tem o domínio do negócio e sabe o que fazer para executar cada uma das operações implementadas na camada de apresentação.
Como uma figura(quando bem feita) vale mais que mil palavras, mostro a seguir um esquema bem simplificado onde represento a sequência natural da chamada que inicia na camada de apresentação passa pela camada de negócios e chega na camada de acesso dados. A seta vermelha indicando uma chamada direta entre a camada de apresentação e a camada de acesso a dados nunca deverá ocorrer.
|  | 
Para encerrar mostro a seguir a estrutura do formulário frmEstudantes com o tratamento dos eventos e dos métodos:
|  | 
É óbvio que poderíamos usar um modelo mais complexo com a utilização de interfaces e de uma camada de persistência feita por uma ferramenta OR/M como o NHIbernate ou o Entity Framework mas eu creio que este exemplo foi simples o suficiente sem perder os conceitos principais envolvidos na criação de uma aplicação em camadas.
Pegue o projeto completo aqui: 
 Aplicacao3Camadas.zip
 
Aplicacao3Camadas.zip
Aguarde que a próxima etapa será mostrar como criar um projeto em camadas usando a linguagem C#. Até lá...
Eu sei é apenas .NET mas eu gosto...

| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
             Gostou ?
  Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter 
Referências:
José Carlos Macoratti