.NET

15 jan, 2013

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

Publicidade

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 nelas 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 e depois 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 aos dados é responsável pelo acesso e pela 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:

  • AcessoDados – Classe genérica que contém os métodos para acesso e persistência de dados;
  • ClasseDAL – Classe contém os métodos para acesso e persistência das informações sobre a entidade Classe;
  • AlunosDAL – Classe contém os métodos para acesso e persistência das informações sobre a entidade Aluno;

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. Depois 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

  • 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 e 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.

  • 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.vbe em seguida, 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:

  1. DeletaAlunoPorId – exclui um aluno da tabela;
  2. GetAlunos – Obtém todos os alunos;
  3. GetAlunoPorId – Obtém um aluno pelo seu código;
  4. GetAlunosPorClasse – Obtém os alunos de uma classe;
  5. SalvaAluno – Salva os dados de um aluno.
  • 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 e, a seguir, selecione o template Class e informe o nome ClasseDAL.vb. Após, 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:

  1. DeletaClasse – Deleta uma classe;
  2. GetClasses – Obtém todas a classes;
  3. GetClassePorId – Obtém uma classe pelo seu código;
  4. Salva – Salva os dados de uma classe.

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 terceira parte do artigo.