VB .NET - 7 passos para criar uma aplicação em 3 Camadas - Parte 2


Na primeira parte deste artigo demos os primeiros passos em nossa caminhada cujo objetivo é criar uma aplicação em camadas usando o VB .NET.

Iremos agora iniciar a definição de cada uma das camadas da nossa aplicação começando pela camada DTO que deve estar acessível a todas as camadas da solução e funciona como uma camada de transferência de objetos entre as demais camadas.

Passo 4 - Definindo as classes do nosso domínio na camada DTO - Data Transfer Object

No nosso modelo de desenvolvimento estamos partindo do banco de dados, onde já definimos as tabelas Classe e Alunos, e agora deveremos criar as classes que representam o nosso domínio.

Nosso modelo nos leva a criar as entidades Classe e Aluno que são classes que deverão representar as tabelas Classe e Alunos.

Vamos então definir as classes e nestas classes vamos definir os membros que representam os campos das respectivas tabelas.

1- Criando a classe Classe no projeto CamadaDTO

Clique com o botão direito do mouse sobre o projeto CamadaDTO e selecione Add->Class;

Selecione o template Class e informe o nome Classe.vb e clique no botão Add;

A seguir vamos definir o código abaixo nesta classe:

Public Class Classe
    Private _id As Integer
    Private _nome As String
    Private _acao As Byte
    Public Property ClasseId() As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            _id = value
        End Set
    End Property
    Public Property NomeClasse() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property
    Public Property Acao() As Byte
        Get
            Return _acao
        End Get
        Set(ByVal value As Byte)
            _acao = value
        End Set
    End Property
End Class
A classe Classe possui os membros _id , _nome e _acao e as propriedades:

- ClasseID
- NomeClasse
- Acao

Onde ClasseID representa o campo id da tabela Classe e a propriedade
NomeClasse representa o campo nome da tabela Classe

A propriedade Acao representa a ação que pretendemos realizar na tabela e
que poderá ser: inserir, atualizar, deletar e sem ação

A propriedade Acao foi definida na classe apenas para mostrar que podemos
definir outras propriedades além daquelas que representam os campos da tabela.

2- Criando a classe Aluno no projeto CamadaDTO

Clique com o botão direito do mouse sobre o projeto CamadaDTO e selecione Add->Class;

Selecione o template Class e informe o nome Aluno.vb e clique no botão Add;

A seguir vamos definir o código abaixo nesta classe:

Public Class Aluno
    Private _id As Integer
    Private _nome As String
    Private _classeid As Integer
    Private _acao As Byte
    Public Property AlunoId() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property
    Public Property NomeAluno() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property
    Public Property ClasseId As Integer
        Get
            Return _classeid
        End Get
        Set(ByVal value As Integer)
            _classeid = value
        End Set
    End Property
    Public Property Acao() As Byte
        Get
            Return _acao
        End Get
        Set(ByVal value As Byte)
            _acao = value
        End Set
    End Property
End Class
A classe Aluno possui os membros _id , _nome, classeid e _acao e as propriedades:

- AlunoID
- NomeAluno
- ClasseId
- Acao

Onde AlunoID representa o campo id da tabela Aluno, a propriedade
NomeAluno representa o campo nome da tabela Aluno e o campo ClasseId representa
o campo classeid da tabela Aluno que é uma chave estrangeira.

A propriedade Acao representa a ação que pretendemos realizar na tabela e
que poderá ser: inserir, atualizar, deletar e sem ação

A propriedade Acao foi definida na classe apenas para mostrar que podemos
definir outras propriedades além daquelas que representam os campos da tabela.

Obs: Estou usando a sintaxe antiga para definir as propriedades. A nova sintaxe simplifica
e facilita a leitura do código. Ex: Para a classe Aluno o código ficaria assim:

Public Property AlunoId As Integer
Public Property NomeAluno As String
Public Property ClasseId as Integer
Public Property Acao as Byte

A camada DTO tem como responsabilidade a transferência das informações sobre os objetos Classe e Aluno entre as demais camadas. Lembrando que um DTO não tem nenhum comportamento, exceto para armazenamento e recuperação de seus próprios dados (acessores e modificadores).

Passo 5 - Definindo a camada de acesso a dados - CamadaDAL

A camada de acesso a dados é responsável pelo acesso e a persistência dos dados e nesta camada vamos definir as classes que contém os métodos genéricos para acessar e persistir dados e as classes específicas relacionadas com as classes do nosso domínio. Assim teremos as seguintes classes nesta camada:

Além destas classes a camada de acesso a dados deverá possuir também um arquivo de configuração app.Config onde iremos armazenar a string de conexão e um módulo chamado GlobalDAL.vb que conterá uma enumeração definindo as ações que poderemos fazer em nossas entidades.

1- Criando o arquivo de configuração app.config

Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> New Item;

A seguir selecione o template Application Configuration File e aceite o nome app.config e clique em Add;

A seguir defina neste arquivo entre as tags <configuration> a tag <connectionStrings> contendo a string de conexão com o nosso banco de dados Escola conforme abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  ....... 
  <connectionStrings>
    <add name="ConexaoSQLServer" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Persist Security Info=True;" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  
</configuration>

2- Criando o módulo GlobalDAL.vb

Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Module;

A seguir selecione o template Module e informe o nome GlobalDAL.vb;

A seguir defina neste arquivo o seguinte código:

Module GlobalDAL
    Public Enum FlagAcao
        Insert = 1
        Update = 2
        Delete = 3
        NoAction = 0
    End Enum
End Module

3- Criando as classes AcessoDados, AlunosDAL e ClasseDAL

a- Criando a classe genérica AcessoDados (SQLHelp)

Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class;

A seguir selecione o template Class e informe o nome AcessoDados.vb;

A seguir defina neste arquivo o seguinte código:

Imports System.Configuration
Imports System.Data.SqlClient

Public Class AcessoDados

    Dim conn As SqlConnection
    Dim cmd As SqlCommand
    Dim isTran As Boolean
    Private trans As SqlTransaction
    Dim connStr As String
    
        Public Shared Function GetConnectionString(ByVal strConnection As String) As String
        Dim retorno As New String("")
        If Not String.IsNullOrEmpty(strConnection) Then
            Try
                retorno = ConfigurationManager.ConnectionStrings(strConnection).ConnectionString
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        Else
            retorno = ConfigurationManager.ConnectionStrings("ConexaoSQLServer").ConnectionString
        End If
        Return retorno
    End Function

    Private Function Connect() As Boolean
        Dim connstr As String
        Dim bln As Boolean
        'Try
        If conn Is Nothing Then
            connstr = GetConnectionString("ConexaoSQLServer")
            If connstr <> String.Empty Then
                bln = True
                conn = New SqlConnection(connstr)
            Else
                bln = False
            End If
        End If
        If conn.State = ConnectionState.Closed Then
            Try
                conn.Open()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
        Return bln
    End Function

    Public Sub CloseConn()
        If Not conn Is Nothing Then
            If Not conn.State = ConnectionState.Closed Then
                conn.Close()
            End If
        End If
    End Sub

    Public Function ExecuteQuery(ByVal strCmdTxt As String) As Boolean
        Dim intRows As Integer

        If conn.State = ConnectionState.Closed Then
            Connect()
        End If

        cmd = New SqlCommand
        cmd.Connection = conn
        cmd.CommandText = strCmdTxt
        cmd.CommandType = CommandType.Text

        If Not isTran Then
            intRows = cmd.ExecuteNonQuery()
            conn.Close()
        Else
            cmd.Transaction = trans
            intRows = cmd.ExecuteNonQuery()
        End If
        If intRows > 0 Then
            ExecuteQuery = True
        Else
            ExecuteQuery = False
        End If
    End Function

    Public Function ExecuteAndGetReader(ByVal strCmdTxt As String) As SqlDataReader
        If conn.State = ConnectionState.Closed Then
            Connect()
        End If

        cmd = New SqlCommand
        cmd.Connection = conn
        cmd.CommandText = strCmdTxt
        cmd.CommandType = CommandType.Text

        If Not isTran Then
            ExecuteAndGetReader = cmd.ExecuteReader
        Else
            cmd.Transaction = trans
            ExecuteAndGetReader = cmd.ExecuteReader
        End If
    End Function

    Public Sub New()
        If Not Connect() Then
            Exit Sub
        End If
    End Sub
    Public Sub BeginTransaction()
        If isTran Then Return
        If conn.State = ConnectionState.Closed Then
            conn.Open()
        End If
        trans = conn.BeginTransaction()
        isTran = True
    End Sub
    Public Sub CommitTransaction()
        If Not isTran Then Return
        trans.Commit()
        conn.Close()
        trans = Nothing
        isTran = False
    End Sub
    Public Sub RollBackTransaction()
        If Not isTran Then Return
        trans.Rollback()
        conn.Close()
        trans = Nothing
        isTran = False
    End Sub
End Class
Nesta classe temos definidos os seguintes métodos:
  • GetConnectionString - obtém a string de conexão do arquivo app.config;
  • Connect - Abre uma conexão com o banco de dados SQL Server;
  • CloseConn - fecha a conexão aberta;
  • ExecuteQuery - Executa um comando SQL e retorna um boleano;
  • ExecuteAndGetReader - Executa um comando SQL e retorna um SqlDataReader;
  • Sub New() (Construtor) - O construtor da classe; chama o método Connect;
  • BeginTransaction - Inicia uma transação;
  • CommitTransaction - Faz um commit na transação;
  • RollBackTransaction - Cancela a transação;

Os métodos definidos nesta classe são de uso geral e serão usados para acessar o banco de dados
SQL Server e realizar a persistência dos dados;

Procurei manter este arquivo o mais simples possível mas ele pode ser melhorado com outras opções.

b- Criando a classe AlunosDAL com métodos específicos acessar e persitir dados de um objeto do tipo Aluno

Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class;

A seguir selecione o template Class e informe o nome AlunosDAL.vb;

A seguir defina neste arquivo o seguinte código:

Imports System.Data.SqlClient
Imports CamadaDTO
Imports System.Collections.Generic

Public Class AlunosDAL
    Public Function DeletaAlunoPorId(ByVal _alunoId As Integer) As Boolean
        Dim strSql As String
        Dim objDB As AcessoDados
        strSql = "Delete from Alunos where id=" & _alunoId
        objDB = New AcessoDados
        objDB.ExecuteQuery(strSql)
        Return True
    End Function

    Public Function GetAlunos() As List(Of Aluno)
        Dim objdb As New AcessoDados
        Dim strSql As String = ""
        strSql = "Select * from Alunos"
        Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
        Dim lista As New List(Of Aluno)
        While dr.Read
            Dim alu As Aluno = New Aluno
            alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
            alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
            alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
            lista.Add(alu)
        End While
        dr.Close()
        Return lista
    End Function

    Public Function GetAlunoPorId(ByVal alunoid As Integer) As Aluno
        Dim objdb As New AcessoDados
        Dim strSql As String = ""
        Dim alu As Aluno = Nothing
        strSql = "Select * from Alunos where id= " & alunoid
        Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
        While dr.Read
            alu = New Aluno
            alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
            alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
            alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
        End While
        dr.Close()
        Return alu
    End Function

    Public Function GetAlunosPorClasse(ByVal classeid As Integer) As List(Of Aluno)
        Dim objdb As New AcessoDados
        Dim strSql As String = ""
        strSql = "Select * from Alunos where classeid= " & classeid
        Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
        Dim lista As New List(Of Aluno)
        Dim alu As Aluno = Nothing
        While dr.Read
            alu = New Aluno
            alu.ClasseId = IIf(IsDBNull(dr("classeid")), 0, dr("classeid"))
            alu.AlunoId = IIf(IsDBNull(dr("id")), 0, dr("id"))
            alu.NomeAluno = IIf(IsDBNull(dr("nome")), "", dr("nome"))
            lista.Add(alu)
        End While
        dr.Close()
        Return lista
    End Function

    Public Function SalvaAluno(ByVal _aluno As Aluno) As Boolean
        Dim strsql As String = ""
        Dim objDB As New AcessoDados
        If _aluno.Acao = FlagAcao.Insert Then
            strsql = "Insert into Alunos (nome,classeid) " & "values( '" & _aluno.NomeAluno.Trim() & "', " & _aluno.ClasseId & ")"
        ElseIf _aluno.Acao = FlagAcao.Update Then
            strsql = "Update Alunos set" & "nome='" & _aluno.NomeAluno & "'," & " classeid=" & _aluno.ClasseId & "' " & " where id=" & _aluno.AlunoId
        End If
        objDB.ExecuteQuery(strsql)
        Return True
    End Function
End Class

Nesta classe criamos os métodos:

c- Criando a classe ClasseDAL com métodos específicos acessar e persitir dados de um objeto do tipo Classe

Clique com o botão direito do mouse sobre o projeto CamadaDAL e selecione Add -> Class;

A seguir selecione o template Class e informe o nome ClasseDAL.vb;

A seguir defina neste arquivo o seguinte código:

Imports System.Data.SqlClient
Imports CamadaDTO
Imports System.Collections.Generic

Public Class ClasseDAL
    Public Function DeletaClasse(ByVal ClasseID As Integer) As Boolean
        Dim strSql As String
        Dim objdb As New AcessoDados
        Try
            strSql = "Delete from Alunos where id= " & ClasseID
            objdb.ExecuteQuery(strSql)
            objdb = New AcessoDados
            strSql = "Delete from Classe where id= " & ClasseID
            objdb.ExecuteQuery(strSql)
        Catch ex As Exception
            Throw New Exception
        End Try
        Return True
    End Function

    Public Function GetClasses() As List(Of Classe)
        Dim strSql As String
        Dim objdb As New AcessoDados
        Dim lista As New List(Of Classe)
        strSql = "Select * from Classe"
        Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
        While dr.Read
            Dim cls As Classe = New Classe
            cls.ClasseId = IIf(IsDBNull(dr("id")), 0, dr("id"))
            cls.NomeClasse = IIf(IsDBNull(dr("nome")), "", dr("nome"))
            lista.Add(cls)
        End While
        dr.Close()
        Return lista
    End Function

    Public Function GetClassePorId(ByVal Id As Integer) As Classe
        Dim strSql As String
        Dim objdb As New AcessoDados
        Dim cls As Classe = Nothing
        strSql = "Select * from Classe where id= " & Id
        Dim dr As SqlDataReader = objdb.ExecuteAndGetReader(strSql)
        Dim arr As New ArrayList
        While dr.Read
            cls = New Classe
            cls.ClasseId = IIf(IsDBNull(dr("id")), 0, dr("id"))
            cls.NomeClasse = IIf(IsDBNull(dr("nome")), "", dr("nome"))
        End While
        dr.Close()
        Return cls
    End Function

    Public Function Salva(ByVal cls As Classe) As Boolean
        Dim strsql As String = String.Empty
        Dim objDB As New AcessoDados
        If cls.Acao = FlagAcao.Insert Then
            strsql = "Insert into Classe (nome) values( '" & cls.NomeClasse.Trim() & "')"
        ElseIf cls.Acao = FlagAcao.Update Then
            strsql = "Update Classe set nome='" & cls.NomeClasse.Trim() & "'" & " where id=" & cls.ClasseId
        Else
            Return False
        End If
        Try
            objDB.ExecuteQuery(strsql)
        Catch ex As Exception
            Throw New Exception
        End Try
        Return True
    End Function
End Class

Nesta classe criamos os métodos:

Nos métodos das classes AlunosDAL e ClasseDAL estamos usando instruções SQL como texto no código. Uma melhor opção seria a utilização de stored procedures por serem mais seguras e mais rápidas.

Aguarde os próximos passos na segunda parte do artigo: VB .NET - 7 passos para criar uma aplicação em 3 Camadas - Parte 3

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