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 = FalseTry _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
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 Twitter
Referências:
José Carlos Macoratti