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 Onde ClasseID
representa o campo id da tabela Classe e a propriedade A propriedade Acao
representa a ação que pretendemos realizar na tabela e A propriedade Acao
foi definida na classe apenas para mostrar que podemos |
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 Onde AlunoID
representa o campo id da tabela Aluno, a propriedade A propriedade
Acao
representa a ação que pretendemos realizar na tabela e A propriedade
Acao
foi definida na classe apenas para mostrar que podemos Obs: Estou usando a
sintaxe antiga para definir as propriedades. A nova
sintaxe simplifica Public
Property AlunoId As Integer |
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:
Os métodos definidos nesta
classe são de uso geral e serão usados para acessar o
banco de 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: