C# - Criando uma aplicação ASP .NET em 3 Camadas
Neste artigo eu vou mostrar de forma bem resumida como criar uma aplicação ASP .NET em 3 camadas usando a linguagem C#. |
O significa criar uma aplicação em camadas ?
Quando você acessa a página do seu banco na internet esta usando uma aplicação que possui uma tela de apresentação onde você, usuário, recebe e entra com as informações.
- Quando você faz o login na sua
conta acessando a página do seu banco na internet existe uma
interface onde você informa seu login e senha.
- Quando você submete esta informação a aplicação aplica as
regras de negócios para verificar se seu login e senha são
válidos.
- Para isso ele consulta um cadastro de informações, que esta
em um banco de dados, e verifica se o que o usuário digitou
corresponde ao que esta no cadastro;
Com esse exemplo bem simples podemos perceber que temos 3 partes distintas atuando:
A figura abaixo procura mostrar de forma resumida esses 3 componentes identificando e nomeando cada um deles;
Podemos identificar as
seguintes camadas:
|
Embora para o cliente tudo seja apenas uma única aplicação para o desenvolvedor (você), criar uma aplicação em camadas significa desenvolver separadamente cada um dos componentes identificados no exemplo acima de forma a facilitar a manutenção e ganhar produtividade.
Chama-se a isso uma aplicação com arquitetura em 3 camadas. (Podemos ter aplicações em n-camadas)
Resumindo:
A arquitetura em 3 camadas é uma
arquitetura cliente servidor na qual a interface do usuário,
processos de negócios e armazenamento de dados são
desenvolvidos e mantidos em módulos independentes, ou em
plataforma separadas.
Basicamente existem 3 camadas :
- Camada de
apresentação - User Interface (UI)
- Camada de Negócios - Business Logic Layer (BLL)
- Camada de Acesso a dados - Data Access Layer (DAL)
Cada camada pode ser desenvolvida e testada separadamente.
Para a nossa aplicação ASP .NET podemos resumir a arquitetura em 3 camadas da seguinte forma:
1- A camada de
apresentação contém os elementos da interface do
usuário do site e inclui toda a lógica que inclui a interação entre o visitante e as regras de negócio. (ASP .NET Web Forms, Users Controls e Master Pages) 2- A camada de negócio (BLL) recebe
a requisição da camada de apresentação e retorna o
resultado dependendo 3- A camada de acesso a
dados contém as classes que acessam o banco de dados e
retornam o resultado a camada |
Criando a aplicação ASP .NET em 3 camadas
1-) Definindo o banco de dados a tabela e a stored procedure
Em nosso exemplo iremos criar uma aplicação ASP .NET para gerenciar as informações de clientes existentes na tabela Clientes do banco de dados Macoratti.mdf do SQL Server.
O script para gerar o banco de dados Macoratti.mdf e a tabela Clientes é dado a seguir:
CREATE
DATABASE [Macoratti] ON PRIMARY ( NAME = N'Macoratti', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Macoratti.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Macoratti_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Macoratti_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO USE [Macoratti] GO CREATE TABLE [dbo].[Clientes]( [id] [int] IDENTITY(1,1) NOT NULL, [nome] [nvarchar](50) NULL, [email] [nvarchar](150) NULL, [nascimento] [date] NULL, CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO |
Se você desejar incluir dados na tabela Clientes usando o SQL Server Management Studio pode usar o seguinte script:
INSERT INTO [Macoratti].[dbo].[Clientes] ([nome] ,[email] ,[nascimento]) VALUES (<nome, nvarchar(50),> ,<email, nvarchar(150),> ,<nascimento, date,>) GO |
Em VALUES inclua os dados que deseja incluir.
O banco de dados Macoratti.mdf foi criado no SQL Server Management Studio e nele também foi criado uma stored procedure chamada GetClientes conforme mostra a figura abaixo:
Essa stored procedure GetClientes acesso a tabela Clientes e retorna todos os registros da tabela.
Vamos usar o Visual Web Developer 2010 Express Edition para criar o nosso site.
No menu File clique em New Web Site e a seguir selecione a linguagem Visual C# , o template ASP .NET Empty Web Site, informe o nome ASPNET_3Camadas e clique no botão OK;
2-) Criando o projeto no Visual Web Developer Express
Na janela Solution Explorer você poderá ver a estrutura do projeto contendo apenas o arquivo web.config.
Vamos incluir uma Master Page no projeto. No menu WebSite selecione Add New Item e a seguir selecione o template Master Page , informe o nome Site.master e clique no botão Add;
Após incluir a Master Page vamos incluir nela uma tabela com 3 linhas e 1 coluna a partir do menu Table->Insert Table. Definindo na página o seguinte leiaute:
3-) Definindo as Classes do projeto
Vamos agora definir 3 classes em nosso projeto:
Vamos criar uma nova pasta no projeto chamada App_Code para conter essas 3 classes.
A pasta App_Code
é uma pasta especial onde você pode armazenar seu
código-fonte e ele será compilado automaticamente em
tempo de execução.O assembly resultante está
acessível a todos os outros códigos no aplicativo da
Web, desta forma a pasta App_Code
funciona como a pasta Bin, exceto que
você pode armazenar código-fonte nela em vez de código
compilado. A pasta App_Code e seu status especial em um aplicativo ASP.NET torna possível criar classes personalizadas e outros arquivos que contém somente código-fonte e usá-los em seu aplicativo da Web sem ter que compilá-los independentemente. A pasta App_Code pode conter quantos arquivos e sub-pastas quanto você precisar. Você pode organizar seu código-fonte de qualquer forma que você achar conveniente, |
No menu WebSite, clique em Add ASP .NET Folder e selecione App_Code;
- Criando a classe Configuracao.cs
Vamos agora criar a classe Configuracao.cs na pasta App_Code;
Clique com o botão direito do mouse sobre a pasta App_Code e selecione Add New Item;
Selecione o template Class, informe o nome Configuracao.cs e clique no botão Add;
Em seguida digite o código abaixo na classe Configuracao.cs:
using System.Configuration; public static class Configuracao { private static string dbConnectionString; private static string dbProviderName; static Configuracao() { dbConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; dbProviderName = ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName; } public static string DbConnectionString { get { return dbConnectionString; } } public static string DbProviderName { get { return dbProviderName; } } } |
Neste código estamos usando o namespace System.Configuration pois vamos obter a string de conexão e o nome do provedor a partir do arquivo de configuração Web.Config;
Vamos então abrir o arquivo Web.Config e incluir na seção connectionStrings a string de conexão para acesso ao banco de dados Macoratti e o nome do provedor conforme abaixo:
<connectionStrings> <add name="ConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Macoratti;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> |
- Criando a classe AcessoDados.cs
Clique com o botão direito do mouse sobre a pasta App_Code e selecione Add New Item;
Selecione o template Class, informe o nome AcessoDadaos.cs e clique no botão Add;
Em seguida digite o código abaixo na classe AcessoDados.cs:
using System; using System.Data; using System.Data.Common; namespace Macoratti { public static class AcessoDados { static AcessoDados() { } //Cria um commando public static DbCommand CreateCommand() { string dbProviderName = Configuracao.DbProviderName; string dbConnectionString = Configuracao.DbConnectionString; DbProviderFactory factory = DbProviderFactories.GetFactory(dbProviderName); DbConnection connection = factory.CreateConnection(); connection.ConnectionString = dbConnectionString; DbCommand command = connection.CreateCommand(); command.CommandType = CommandType.StoredProcedure; return command; } public static DataTable ExecuteReader(DbCommand command) { DataTable table; try { command.Connection.Open(); DbDataReader reader = command.ExecuteReader(); table = new DataTable(); table.Load(reader); } catch (Exception ex) { throw ex; } finally { command.Connection.Close(); } return table; } public static int ExecuteNoneQuery(DbCommand command) { int linhasAfetadas = -1; try { command.Connection.Open(); linhasAfetadas = command.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { command.Connection.Close(); } return linhasAfetadas; } public static string ExecuteScalar(DbCommand command) { string valor = ""; try { command.Connection.Open(); valor = command.ExecuteScalar().ToString(); } catch (Exception ex) { throw ex; } finally { command.Connection.Close(); } return valor; } } } |
Nesta classe definimos 4 métodos para acessar os dados:
a- CreateCommand - Cria um novo comando a partir do nome do provedor;
O método CreateCommand() é do tipo DbCommand e cria um novo comando usando uma fábrica de provedores usando o nome do provedor e a string de conexão para criar um comando para o provedor definido no arquivo Web.Config;
O novo modelo de
provedor disponível a partir da ADO.NET 2.0 esta baseado
em um série de classes base no namespace
System.Data.Comom. A classe DBProviderFactories
permite a realização de dois tipos de tarefas:
Uma classe base de provedor é um objeto factory que é usado para criar um conjunto de objetos relacionados como SqlConnection e SqlCommand. Eles retornam um tipo de classe abstrata do tipo DBConnection. As classes de provider factory são derivadas de uma classe base abstrata : System.Data.Common.DbProviderFactory , e , para cada tipo de base de dados a ser acessado temos uma nova classe derivada desta classe base abstrata. A classe DbDataProvider define o número de funções que esta subclasse precisa implementar:
Desde que o DbProviderFactory apropriado foi criado a função na tabela acima pode ser usada para criar o objeto apropriado ao invés de usar o operador New como anteriormente.(Para determinar todas as classes DbProviderFactory disponíveis e criar suas classes adicionais é fornecido a classe System.Data.Common.DbProviderFactories) Cada provedor de dados faz o registro de uma classe ProviderFactory no arquivo machine.config da plataforma .NET. A classe base DbProviderFactory e a classe ProviderFactories podem retornar um DataTable de informações sobre os diferentes provedores registrados no arquivo machine.config e podem recuperar a ProviderFactory conforme a sequência do provedor fornecida ou um DataRow de um DataTable. |
b- ExecuteReader - Retorna um DataTable usando para instruções SELECT para obter os dados retornado por consultas SQL usando SELECT;
O método ExecuteReader
possui um parâmetro DbCommand; este comando
irá obter um DataTable resultado da consulta
SELECT.
O DbDataReader irá ler todos os
dados a partir das tabelas e finalmente o comando irá retornar o
resultado como um DataTable.
c- ExecuteNonQuery
- Usado para instruções INSERT, UPDATE, DELETE. Nesta caso não
teremos dados retornados apenas as linhas(registros) que foram
afetadas;
d- ExecuteScalar -
Usado para obter somente o primeiro dado retornado pela consulta
SELECT;
- Criando a classe Cliente.cs
Clique com o botão direito do mouse sobre a pasta App_Code e selecione Add New Item;
Selecione o template Class, informe o nome Cliente.cs e clique no botão Add;
Em seguida digite o código abaixo na classe Cliente.cs:
using System.Data; using System.Data.Common; namespace Macoratti { public class Cliente { public static DataTable GetClients() { DbCommand command = AcessoDados.CreateCommand(); command.CommandText = "GetClientes"; return AcessoDados.ExecuteReader(command); } } } |
Neste código criamos um comando para usar a stored procedure GetClientes que criamos no banco de dados Macoratti.mdf;
A seguir executamos o método ExecuteReader da classe AcessoDados que retornar um DataTable com os dados dos clientes.
4-) Definindo a camada de apresentação
Vamos incluir no projeto um novo Web Forms para exibir as informações da tabela Clientes usando as classes que criamos nos tópicos anteriores.
No menu WebSite clique em Add New Item, e a seguir selecione o template Web Form, informe o nome ListaClientes.aspx e marque a opção : Select master page e clique no botão Add;
A seguir selecione a master page Site.master e clique em OK;
Em seguida na página ListaClientes.aspx inclua um controle GridView alterando seu ID para gdvClientes;
A seguir abra o arquivo ListaClientes.aspx.cs de defina o código abaixo no evento Load da página:
namespace Macoratti { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { gdvClientes.DataSource = Cliente.GetClientes(); gdvClientes.DataBind(); } } } |
Pegue o projeto completo aqui: (Versão C#) - 3-CamadasASPNET_CSharp.zip
Veja a versão para VB .NET deste artigo: VB .NET - Criando uma aplicação ASP .NET em 3 Camadas
"Tornou pois Jesus a dizer-lhes: Em verdade vos digo que eu sou a porta das ovelhas. Todos quantos vieram antes de mim são ladrões e salteadores; mas as ovelhas não os ouviram. Eu sou a porta; se alguém entrar por mim. salvar-se-á, e entrará, e sairá, e achará pastagens." (João 10:7-9)
Referências:
NET - Considerações sobre arquitetura e desenho de aplicações