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

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