O documento descreve como criar uma aplicação em três camadas usando Visual Basic .NET, dividido em sete passos. Primeiro, cria-se um banco de dados e tabelas. Em seguida, cria-se uma solução com quatro projetos representando as camadas de apresentação, negócios, dados e transferência de dados, definindo suas dependências.
O documento descreve como criar uma aplicação em três camadas usando Visual Basic .NET, dividido em sete passos. Primeiro, cria-se um banco de dados e tabelas. Em seguida, cria-se uma solução com quatro projetos representando as camadas de apresentação, negócios, dados e transferência de dados, definindo suas dependências.
Descrição original:
Título original
VB .NET - 7 Passos Para Criar Uma Aplicação Em 3 Camadas
O documento descreve como criar uma aplicação em três camadas usando Visual Basic .NET, dividido em sete passos. Primeiro, cria-se um banco de dados e tabelas. Em seguida, cria-se uma solução com quatro projetos representando as camadas de apresentação, negócios, dados e transferência de dados, definindo suas dependências.
O documento descreve como criar uma aplicação em três camadas usando Visual Basic .NET, dividido em sete passos. Primeiro, cria-se um banco de dados e tabelas. Em seguida, cria-se uma solução com quatro projetos representando as camadas de apresentação, negócios, dados e transferência de dados, definindo suas dependências.
Baixe no formato DOCX, PDF, TXT ou leia online no Scribd
Fazer download em docx, pdf ou txt
Você está na página 1de 34
VB .
NET - 7 passos para criar uma aplicao em 3
Camadas - Parte 1
O foco deste artigo explicar como criar uma aplicao em 3 camadas usando o Visual Basic .NET.(de novo) Modelo em trs camadas, derivado do modelo em n camadas, recebe esta denominao quando um sistema cliente-servidor desenvolvido retirando-se a camada de negcio do lado do cliente. O desenvolvimento mais demorado no incio comparando-se com o modelo em duas camadas pois necessrio dar suporte a uma maior quantidade de plataformas e ambientes diferentes. Em contrapartida, o retorno vem em forma de respostas mais rpidas nas requisies, excelente performance tanto em sistemas que rodam na intranet ou internet e mais controle no crescimento do sistema. As trs partes de um ambiente modelo trs camadas so: camada de apresentao, camada de negcio e camada de dados. Deve funcionar de maneira que o software executado em cada camada possa ser substitudo sem prejuzo para o sistema. De modo que atualizaes e correes de defeitos podem ser feitas sem prejudicar as demais camadas. Por exemplo: alteraes de interface podem ser realizadas sem o comprometimento das informaes contidas no banco de dados. (Fonte:http://pt.wikipedia.org/wiki/Modelo_em_tr%C3%AAs_camad as) A figura abaixo procura mostrar de forma resumida esses 3 componentes identificando e nomeando cada um deles;
Podemos identificar as seguintes camadas: Camada de Apresentao (Presentation Tier - UI) Camada de Negcios (Business Logic Tier - BLL) Camada de Acesso a dados (Data Tier - DAL) Obs: Na verdade a nossa soluo ter 4 camadas mas a camada de transferncia de dados (DTO) ser considerada uma camada auxiliar onde iremos declarar as nossas classes POCO usadas para transferir informaes sobre os objetos do nosso domnio. A transferncia de dados de objeto (DTO), um padro de projeto usado para transferir dados entre os subsistemas de aplicativos de software. Os DTOs so muitas vezes utilizados em conjunto com os objetos de acesso a dados para recuperar dados de um banco de dados. A diferena entre os objetos de transferncia de dados e objetos de negcios ou objetos de acesso a dados que um DTO no tem nenhum comportamento, exceto para armazenamento e recuperao de seus prprios dados (acessores e modificadores) Na prtica estaremos fazendo uma implementao do padro DAO (Data Access Object) que define que toda a lgica de acesso aos dados deve ser separada da lgica de apresentao e lgica do negcio (regras da aplicao). A implementao dos DAOs muito simples, para cada objeto DTO teremos um objeto DAO que ser responsvel por realizar todas as operaes de persistncia deste objeto na base de dados. Existem diversas implementaes do padro DAO mas em geral podemos relacionar algumas caractersticas desejveis em uma implementao do padro DAO: - Todo o acesso aos dados deve ser feita atravs das classes DAO de forma a se ter o encapsulamento; - Cada instncia da DAO responsvel por um objeto de domnio; - O DAO deve ser responsvel pelas operaes CRUD no domnio; - O DAO no deve ser responsvel por transaes , sesses ou conexes que devem ser tratados fora do DAO; O principais benefcios deste padro so: Separao da lgica da persistncia da lgica de negcios; Facilidade na manuteno; Reduo da complexidade do cdigo da regra de negcios; Centralizao de todo o acesso aos dados em uma camada separada; Vamos dividir esta tarefa em 7 etapas e explicar cada uma em detalhes de forma que mesmo quem esta iniciando o seu aprendizado no assunto possa acompanhar e entender o que foi feito. Antes de iniciar a nossa caminhada (sero somente 7 passos) vamos declarar os apetrechos necessrios para termin-la com xito : Recursos necessrios para iniciar a jornada: 1. Visual Basic 2010 Express Edition 2. Um banco de dados Relacional : SQL Server 2008 Express, MySQL, Oracle, etc. (e at o MS Access) 3. SQL Server Management Studio Passo 1 - Criando um banco de dados relacional e as tabelas usadas na aplicao Vamos criar duas tabelas bem simples e um banco de dados no SQL Server 2008 Express Edition usando o SQL Server Management Studio. Nota: Veja o artigo : Usando o SQL Server Management Studio - Macoratti.net Como eu estou usando a verso na qual apliquei o pacote de localizao voc ver as mensagens, menus, etc em portugus. Abra o SQL Server Management Studio(SSMS) e faa o login no seu SQL Server Local (indicado como .\SQLEXPRESS); Aps abrir o SSMS clique com o boto direito do mouse sobre o item Banco de dados e selecione Novo Banco de dados...
Na janela - Novo Banco de dados - informe o nome Escola para o nome do banco de dados e clique no boto OK;
Aps criar o banco de dados Escola clique com o boto direito sobre ele e selecione Nova Tabela...
A seguir defina os campos id e nome nesta tabela sendo que o campo id uma chave primria e do tipo identity. O nome da tabela Classe;
USE [Escola] GO CREATE TABLE [dbo].[Classe]( [id] [int] IDENTITY(1,1) NOT NULL, [nome] [varchar](50) NULL, CONSTRAINT [PK_Classe] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECO MPUTE = OFF) ON [PRIMARY] ) ON [PRIMARY] GO Acima temos a tabela Classe criada e ao lado o script para gerar a tabela na janela de consultas do SSMS. Agora vamos repetir o procedimento e criar a tabela Alunos com os campos: id, nome e classeid, onde id um campo chave primria do tipo identity:
USE [Escola] CREATE TABLE [dbo].[Alunos]( [id] [int] IDENTITY(1,1) NOT NULL, [nome] [nvarchar](50) NULL, [classeid] [int] NULL, CONSTRAINT [PK_Alunos] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECO MPUTE = OFF) ON [PRIMARY] ) ON [PRIMARY]
GO Acima temos a tabela Alunos criada e ao lado o script para gerar a tabela: Aps criar as tabelas vamos criar um diagrama das tabelas do banco de dados Escola e definir o relacionamento entre o campo id da tabela Classe e o campo classeid da tabela Alunos; Na figura abaixo podemos notar que o relacionamento do tipo um-para- muitos onde temos que uma classe pode conter muitos alunos:
Dessa forma j temos o banco de dados Escola , as tabelas Classe e Alunos e o relacionamento entre as tabelas criados. Obs: Podemos incluir alguns registros nas tabelas usando a instruo INSERT INTO na janela de Consultas do SSMS. INSERT INTO [Escola].[dbo].[Classe] ([nome]) VALUES ('Anlise Requisitos') GO INSERT INTO [Escola].[dbo].[Alunos] ([nome] ,[classeid]) VALUES ('Macoratti',1) GO Tabela Classe Tabela Alunos Vamos ao segundo passo... Nota: Dvidas com SQL ??? Veja o curso : Curso de SQL. - Macoratti.net e a Seo SQL do Site Macoratti.net Passo 2 - Criando a soluo no Visual Basic 2010 Express Edition No segundo passo vamos criar um novo projeto usando o Visual Basic 2010 Express Edition. Vamos criar uma soluo contendo 3 projetos onde cada projeto representar uma camada da nossa aplicao. Assim teremos: 1. Soluo - AppTresCamadas 2. Projeto Windows Forms - Camada de Apresentao - CamadaWin 3. Projeto Class Library - Camada de Negcios - CamadaBLL 4. Projeto Class Library - Camda de Acesso aos Dados - CamadaDAL No menu File clique em New Project e selecione o template Windows Forms Application informando o nome CamadaWin; No menu File clique em Save All e na janela Save Project informe o nome AppTresCamadas para o nome da soluo e clique em Save;
Vamos agora incluir a camada de negcios: No menu File clique em Add e a seguir em New Project e selecione o template Class Library informando o nome CamadaBLL e clicando em OK;
Agora vamos incluir a camada de acesso aos dados: No menu File clique em Add e a seguir em New Project e selecione o template Class Library informando o nome CamadaDAL e clicando em OK; Definindo a camada DTO. Finalmente vamos incluir uma camada onde vamos definir as classes do nosso domnio. Essa camada ser uma camada de transferncia que dever ser enxergada pelos demais projetos. No menu File clique em Add e a seguir em New Project e selecione o template Class Library informando o nome CamadaDTO e clicando em OK; Ao final desta etapa na janela Solution Explorer deveremos ter a estrutura conforme exibe a figura abaixo:
Passo 3 - Definindo as dependncias e referncias entre os projetos da soluo Neste passo temos que definir as dependncias entre os 4 projetos criados na soluo. Em nossa soluo teremos as seguintes dependncias: 1. A camada de apresentao - projeto CamadaWin - dever possuir uma dependncia para o projeto CamadaBLL que a nossa camada de negcios; 2. A camada de negcios - projeto CamadaBLL - dever possuir uma dependncia para o projeto CamadaDAL que nossa camada de acesso aos dados; 3. A camada de transferncia de dados - DTO - Data Transfer Object - que dever ser visto pelos demais projetos; Assim teremos a seguinte hierarquia: CamadaWin (CamadaDTO) => CamadaBLL (CamadaDTO) => CamadaDAL => CamadaDTO Dessa forma a camada de apresentao dever enxergar a camada de negcios que por sua vez dever enxergar a camada de acesso a dados. Clique com o boto direito sobre o nome da soluo e selecione Properties ou tecle ALT+ENTER; Na janela de propriedades selecione o item - Project Dependencies ; A seguir na combo Project selecione o projeto CamadaWin e na janela Depends on: marque CamadaBLL e CamadaDTO:
Repita o procedimento anterior selecionando na combo Project o projeto CamadaBLL e na janela Depends on: marque CamadaDAL e CamadaDTO:
Repita o procedimento anterior selecionando na combo Project o projeto CamadaDAL e na janela Depends on: marque CamadaDTO:
Para concluir esse passo temos definir o projeto que dever ser executado quando a aplicao for iniciada. Na nossa soluo queremos que o projeto Windows Forms (camada de apresentao) seja o projeto executado quando a soluo inicie: Nas janela de propriedades da soluo clique no item Startup Project e selecione Single Startup project escolhendo o projeto CamadaWin e clicando no boto OK:
Aps definir estas dependncias temos que incluir as referncias entre os projetos da nossa soluo. Na janela Solution Explorer clique com o boto direito do mouse sobre o projeto CamadaDAL e clique em Add Reference; A seguir selecione a guia Projects e selecione o projeto CamadaDAL e o projeto CamadaDTO e clique em OK;
Repita o procedimento acima para o projeto CamadaDAL referenciando o projeto CamadaDTO;
Faa o mesmo para o projeto CamadaWin referenciando os projetos CamadaBLL e CamadaDTO:
Vamos agora descansar um pouco da nossa caminhada, afinal demos 3 longos passos, e temos que recuperar as foras para prosseguir... Na primeira parte deste artigo demos os primeiros passos em nossa caminhada cujo objetivo criar uma aplicao em camadas usando o VB .NET. Iremos agora iniciar a definio de cada uma das camadas da nossa aplicao comeando pela camada DTO que deve estar acessvel a todas as camadas da soluo e funciona como uma camada de transferncia de objetos entre as demais camadas. Passo 4 - Definindo as classes do nosso domnio 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 domnio. Nosso modelo nos leva a criar as entidades Classe e Aluno que so classes que devero representar as tabelas Classe e Alunos. Vamos ento 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 boto direito do mouse sobre o projeto CamadaDTO e selecione Add->Class; Selecione o template Class e informe o nome Classe.vb e clique no boto Add; A seguir vamos definir o cdigo 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 ao que pretendemos realizar na tabela e que poder ser: inserir, atualizar, deletar e sem ao A propriedade Acao foi definida na classe apenas para mostrar que podemos definir outras propriedades alm daquelas que representam os campos da tabela. 2- Criando a classe Aluno no projeto CamadaDTO Clique com o boto direito do mouse sobre o projeto CamadaDTO e selecione Add->Class; Selecione o template Class e informe o nome Aluno.vb e clique no boto Add; A seguir vamos definir o cdigo 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 ao que pretendemos realizar na tabela e que poder ser: inserir, atualizar, deletar e sem ao A propriedade Acao foi definida na classe apenas para mostrar que podemos definir outras propriedades alm 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 cdigo. Ex: Para a classe Aluno o cdigo 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 transferncia das informaes sobre os objetos Classe e Aluno entre as demais camadas. Lembrando que um DTO no tem nenhum comportamento, exceto para armazenamento e recuperao de seus prprios dados (acessores e modificadores). Passo 5 - Definindo a camada de acesso a dados - CamadaDAL A camada de acesso a dados responsvel pelo acesso e a persistncia dos dados e nesta camada vamos definir as classes que contm os mtodos genricos para acessar e persistir dados e as classes especficas relacionadas com as classes do nosso domnio. Assim teremos as seguintes classes nesta camada: AcessoDados - Classe genrica que contm os mtodos para acesso e persistncia de dados; ClasseDAL - Classe contm os mtodos para acesso e persistncia das informaes sobre a entidade Classe; AlunosDAL - Classe contm os mtodos para acesso e persistncia das informaes sobre a entidade Aluno; Alm destas classes a camada de acesso a dados dever possuir tambm um arquivo de configurao app.Config onde iremos armazenar a string de conexo e um mdulo chamado GlobalDAL.vb que conter uma enumerao definindo as aes que poderemos fazer em nossas entidades. 1- Criando o arquivo de configurao app.config Clique com o boto 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 conexo 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 mdulo GlobalDAL.vb Clique com o boto 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 cdigo: 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 genrica AcessoDados (SQLHelp) Clique com o boto 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 cdigo: 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).Connec tionString Catch ex As Exception MsgBox(ex.Message) Nesta classe temos definidos os seguintes mtodos: GetConnectionString - obtm a string de conexo do arquivo app.config; Connect - Abre uma conexo com o banco de dados SQL Server; CloseConn - fecha a conexo aberta; ExecuteQuery - Executa um comando SQL e retorna um boleano; ExecuteAndGetRead er - Executa um comando SQL e retorna um SqlDataReader; End Try Else retorno = ConfigurationManager.ConnectionStrings("ConexaoSQLServer").C onnectionString 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
If Not isTran Then intRows = cmd.ExecuteNonQuery() conn.Close() Else cmd.Transaction = trans intRows = cmd.ExecuteNonQuery() Sub New() (Construtor) - O construtor da classe; chama o mtodo Connect; BeginTransaction - Inicia uma transao; CommitTransaction - Faz um commit na transao; RollBackTransaction - Cancela a transao; Os mtodos definidos nesta classe so de uso geral e sero usados para acessar o banco de dados SQL Server e realizar a persistncia dos dados; Procurei manter este arquivo o mais simples possvel mas ele pode ser melhorado com outras opes. 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
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 b- Criando a classe AlunosDAL com mtodos especficos acessar e persitir dados de um objeto do tipo Aluno Clique com o boto 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 cdigo: 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 mtodos: DeletaAlunoPorId - exclui um aluno da tabela GetAlunos - Obtm todos os alunos GetAlunoPorId - Obtm um aluno pelo seu cdigo GetAlunosPorClasse - Obtm os alunos de uma classe SalvaAluno - Salva os dados de um aluno c- Criando a classe ClasseDAL com mtodos especficos acessar e persitir dados de um objeto do tipo Classe Clique com o boto 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 cdigo: 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 mtodos: DeletaClasse - Deleta uma classe GetClasses - Obtm todas a classes GetClassePorId - Obtm uma classe pelo seu cdigo Salva - Salva os dados de uma classe Nos mtodos das classes AlunosDAL e ClasseDAL estamos usando instrues SQL como texto no cdigo. Uma melhor opo seria a utilizao de stored procedures por serem mais seguras e mais rpidas. Na segunda parte deste artigo iniciamos a definio das camadas da nossa soluo iniciando com a camada DTO e a camada de acesso a dados. Continuando a nossa caminhada cujo objetivo criar uma aplicao em camadas usando o VB .NET. Iremos agora continuar a definio das camadas da nossa aplicao desta vez abordando a camada de negcios - CamadaBLL - que responsvel pelas regras de negcio do nosso domnio e onde iremos efetuar as validaes. O objetivo da camada de negcios implementar a lgica da aplicao, expondo esta lgica para a camada de apresentao e outras aplicaes, e tambm acessar a camada de acesso a dados. Passo 6 - Definindo as classes do nosso domnio na camada de negcio - CamadaBLL Como ja escrevi nosso modelo muito simples e estamos usando o padro DAO para implementar as funcionalidades da nossa soluo. Nada muito sofisticado mas funcional seguindo o padro KISS - Keept Simple Stupid. ( um princpio que defende que toda a complicao desnecessria deve ser evitada. Ento se o jeito simples o certo, por que complicamos ? Por pura falta de competncia e preguia. Simples no sinnimo de fcil.) Seguindo este padro vamos agora criar as classes da camada de negcio - CamadaBLL - onde para cada classe do nosso domnio teremos uma classe de negcio relacionada. Vamos ento definir as classes e nestas classes vamos definir os mtodos que acessam a camada de acesso a dados. Eu no estou realizando nenhuma validao nesta camada para deixar o exemplo mais limpo e fcil de entender mas qualquer validao de negcio dever ser feita nesta camada. 1- Criando a classe ClasseBLL Clique com o boto direito do mouse sobre o projeto CamadaBLL e selecione Add->Class; Selecione o template Class e informe o nome ClasseBLL.vb e clique no boto Add; A seguir vamos definir o cdigo abaixo nesta classe: Imports CamadaDTO Imports CamadaDAL Public Class ClasseBLL Public Function GetTodasClasses() As List(Of Classe) Dim db As New ClasseDAL Return db.GetClasses() End Function Public Function GetClassePorCodigo(ByVal _CodigoClasse As Integer) As Classe Dim db As New ClasseDAL Return db.GetClassePorId(_CodigoClasse) End Function Public Function Salvar(ByVal cls As Classe) Dim db As New ClasseDAL Return db.Salva(cls) End Function Public Function DeletarClasse(ByVal _CodigoClasse As Integer) Dim db As New ClasseDAL Return db.DeletaClasse(_CodigoClasse) End Function End Class A classe ClasseBLL possui os mtodos: GetTodasClasses GetClassePorCodigo Salvar DeletarClasse Esta classe esta apenas usando os mtodos criados para acessar os mtodos correspondentes na camada CamadaDAL 2- Criando a classe AlunosBLL Clique com o boto direito do mouse sobre o projeto CamadaBLL e selecione Add->Class; Selecione o template Class e informe o nome AlunosBLL.vb e clique no boto Add; A seguir vamos definir o cdigo abaixo nesta classe: Imports CamadaDTO Imports CamadaDAL Public Class AlunosBLL Public Function GetTodosAlunos() As List(Of Aluno) Dim db As New AlunosDAL Return db.GetAlunos End Function Public Function GetAlunosPorCodigo(ByVal _alunoId As Integer) As Aluno Dim db As New AlunosDAL Return db.GetAlunoPorId(_alunoId) End Function Public Function GetAlunosPorClasse(ByVal _classeId As Integer) Dim db As New AlunosDAL Return db.GetAlunosPorClasse(_classeId) End Function Public Function SalvaAluno(ByVal _aluno As Aluno) Dim db As New AlunosDAL Return db.SalvaAluno(_aluno) End Function Public Function DeletaAluno(ByVal _alunoId As Integer) Dim db As New AlunosDAL Return db.DeletaAlunoPorId(_alunoId) End Function End Class A classe AlunosBLL possui os mtodos: GetTodosAlunos GetAlunosPorCodigo GetAlunosPorClasse SalvaAluno DeletaAluno Esta classe esta apenas usando os mtodos criados para acessar os mtodos correspondentes na camada CamadaDAL As duas classes definidas nesta camada atuam da mesma forma criando uma instncia da camada de acesso a dados e usando o mtodo definido para realizao da operao. As validaes de negcio devem ser realizadas nesta camada. Isso no esta sendo feito neste exemplo pela simplicidade do projeto. Passo 7 - Definindo a camada de apresentao - CamadaWin Vamos agora definir a camada de apresentao onde criaremos um projeto Windows Forms para permitir que o usurio gerencie as classes e os alunos realizando as seguintes operaes: Cadastrar Classe Alterar Classe Cadastrar Aluno Meu objetivo ser mostrar que na camada de apresentao deveremos tratar apenas da apresentao e tratamento das informaes pois a lgica do negcio e a persistncia dos dados esto em camadas separadas. Dessa forma a camada de apresentao no deve saber nada sobre lgica de negcios nem sobre persistncia de dados. A camada de apresentao para atualizar as informaes ir usar os servios da camada de acesso aos dados via camada de negcios, realizando nesta as validaes pertinentes. No formulrio form1.vb que foi criado por padro vamos definir o leiaute conforme mostra a figura abaixo:
Controles principais do formulrio: GroupBox - grpNovaClasse - Text = Classes CboClasses txtNovaClasse btnNovaClasse btnSalvarClasse GroupBox - grpAlunos - Text = Alunos dgvAlunos txtNovoAluno bntSair btnSalvarAluno ErrorProvider - ErrorProvider1
Vamos declarar a utilizao dos namespaces Imports CamadaDTO Imports CamadaBLL Isso necessrio pois precisamos acessar os mtodos da camada de negcios e os objetos na camada DTO. Precisamos definir uma enumerao para declarar qual a ao que desejamos realizar. A seguir temos a enumerao FlagAcao que define 3 tipos de operao: Insert, Update, Delete e NoAction: Public Enum FlagAction Insert = 1 Update = 2 Delete = 3 NoAction = 0 End Enum No formulrio vamos declarar as variveis para tratar as classes Aluno e Classe: Private _alunos As List(Of Aluno) Private _aluno As Aluno Private _classe As Classe Private _classes As List(Of Classe) Esses objetos permitiro acessar e obter informaes sobre alunos e classes. No evento Load do formulrio form1.vb vamos carregar a combobox cboClasses e o DataGridView dgvAlunos com as informaes das classes e alunos: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load carregaCombo() carregaGrid(cboClasses.SelectedValue) End Sub O cdigo do procedimento carregaCombo() o seguinte: Sub carregaCombo() Dim clsBLL As New ClasseBLL _classes = clsBLL.GetTodasClasses With cboClasses .DataSource = _classes .DisplayMember = "NomeClasse" .ValueMember = "ClasseId" End With End Sub O cdigo acessa o mtodo GetTodasClasses da camada de negcios e preenche o combobox com as classes. O cdigo do procedimento carregaGrid() o seguinte: Sub carregaGrid(ByVal classeID As Integer) Dim alnBLL As New AlunosBLL _alunos = alnBLL.GetAlunosPorClasse(classeID) With dgvAlunos
.ColumnHeadersDefaultCellStyle.ForeColor = Color.BurlyWood .Columns.Item("ClasseId").Visible = False .Columns.Item("AlunoId").HeaderText = "Codigo do Aluno" .Columns.Item("NomeAluno").HeaderText = "Nome do Aluno" .Columns.Item("Acao").Visible = False End With End Sub O cdigo acessa o mtodo GetAlunosPorClasse() passando o cdigo da classe e forma a obter e exibir os alunos de acordo com a classe selecionada. No evento SelectedIndexChanged da combobox cboClasses temos o cdigo que obtm as classes e conforme a alterao da classe selecionada carrega e atualiza o datagridview com os alunos pertencentes classe selecionada: Private Sub cboClasses_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboClasses.SelectedIndexChanged If cboClasses.SelectedIndex = -1 Then Exit Sub Dim cls As Classe Dim clsBLL As New ClasseBLL cls = clsBLL.GetClassePorCodigo(cboClasses.SelectedIndex + 1) If Not IsNothing(cls) Then carregaGrid(cls.ClasseId) Me.txtNovaClasse.Text = cls.NomeClasse End If End Sub No evento Click do boto nova classe apenas preparamos a interface para incluir uma nova classe ou cancelar a operao: Private Sub btnNovaClasse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovaClasse.Click
If btnNovaClasse.Text = "Nova Classe" Then btnNovaClasse.Text = "Cancelar" btnSalvarClasse.Enabled = True Me.txtNovaClasse.Text = "" Me.cboClasses.SelectedIndex = -1
grpNovaClasse.Text = "Informe uma nova Classe" grpNovaClasse.BackColor = Color.MintCream grpAlunos.Visible = True grpAlunos.Enabled = False
Me.txtNovaClasse.Focus() ElseIf btnNovaClasse.Text = "Cancelar" Then grpNovaClasse.BackColor = Color.Pink grpAlunos.Visible = True grpAlunos.Enabled = True btnNovaClasse.Text = "Nova Classe" End If End Sub No evento Click do boto Salvar chamamos o procedimento SalvarClasse(): Private Sub btnSalvarClasse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvarClasse.Click SalvarClasse() End Sub O procedimento SalvarClasse() realizar a incluso de uma nova classe ou atualizao de uma classe existente: Sub SalvarClasse()
Dim bln As Boolean Dim clsBLL As New ClasseBLL Dim cls As New Classe
If txtNovaClasse.Text = String.Empty Or txtNovaClasse.Text.Length < 5 Then MsgBox("Informe o nome da nova classe (minmo 5 caracteres).") txtNovaClasse.Focus() Return End If
cls.NomeClasse = Me.txtNovaClasse.Text.Trim
If cboClasses.SelectedIndex = -1 Then cls.Acao = FlagAcao.Insert Else cls.ClasseId = cboClasses.SelectedValue cls.Acao = FlagAcao.Update End If
bln = clsBLL.Salvar(cls)
If bln Then MessageBox.Show("Dados Atualizados com sucesso !") If cboClasses.SelectedIndex = -1 Then carregaCombo() cboClasses.SelectedIndex = 0 End If Refresh(cboClasses.SelectedIndex) grpNovaClasse.Visible = True grpAlunos.Enabled = True btnSalvarClasse.Enabled = False Else MessageBox.Show("Ocorreu um erro ao atualizar os dados !!") btnSalvarClasse.Enabled = False End If End Sub No cdigo do evento Click do boto Salvar (grpAlunos) verificamos se existe uma classe selecionada e um nome de aluno informado para chamar o procedimentoSalvarAluno(): Private Sub btnSalvarAluno_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvarAluno.Click ErrorProvider1.Clear() If cboClasses.SelectedIndex = -1 Then ErrorProvider1.SetError(Me.cboClasses, "Selecione uma Classe!!") Exit Sub End If If Me.txtNovoAluno.Text.Trim() = "" Then ErrorProvider1.SetError(Me.txtNovoAluno, "Informe o nome do Aluno !!") Exit Sub End If SalvarAluno() End Sub O procedimento SalvarAluno() obtm a classe e o nome do aluno, define a ao e chama o mtodo SalvaAluno() passando o objeto Aluno para persistncia dos dados: Sub SalvarAluno() Dim alnBLL As New AlunosBLL Dim aln As New Aluno Dim cls As New Classe Dim clsBLL As New ClasseBLL Try 'obtem a classe selecionada cls = clsBLL.GetClassePorCodigo(cboClasses.SelectedIndex + 1) 'obtem o id da classe aln.ClasseId = cls.ClasseId 'obtem o nome do aluno aln.NomeAluno = Me.txtNovoAluno.Text 'define a ao aln.Acao = FlagAcao.Insert 'usa o mtodo para salvar o aluno alnBLL.SalvaAluno(aln) MessageBox.Show("Dados do aluno atualizado com sucesso !!") Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Estamos sobrescrevendo o mtodo Refresh do formulrio onde atualizamos o controle combobox cboClasses conforme abaixo: Public Overloads Sub Refresh(ByVal intID As Integer)
End Sub Finalmente o evento CLick do boto Sair encerra a aplicao: Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click Application.Exit() End Sub Como podemos observar nossa camada de apresentao no utiliza nem usa nenhuma referncia para realizar a persistncia, ao invs disso ela usa os mtodos da camada de negcios para realizar tais operaes. Assim qualquer mudana na camada de acesso a dados no afeta diretamente nossa camada de apresentao. O exemplo da camada de apresentao no esta completo e foi usado apenas para ilustrar a separao das responsabilidades em camadas. Assim completamos a nossa caminhada em 7 passos onde percorremos as etapas bsicas onde em cada passo abordamos os conceitos relacionados com a separao de responsabilidades e a criao de camadas.