DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 1 - Exemplo prático

Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#. Cenário: Desenvolvimento de um Sistema de Controle de Apólices de Seguros. Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET. No último artigo será postado o código completo.


v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} st1\:*{behavior:url(#ieooui) }

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 1) Camada de Dados.

 

Introdução

 
Os aplicativos multicamadas dividem a funcionalidade em várias camadas separadas por agrupamentos lógicos onde estão as suas funcionalidades. Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#.
 
Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET.
 
A Programação Orientada a Objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos. Neste exemplo, as camadas estarão dispostas no mesmo computador, mas os conceitos e funcionalidades aqui descrios poderão ser utilizadas de forma igual em ambientes distribuídos.
 

Estrura em três camadas:

 
A Figura 1 - Camadas da Aplicação apresenta a estrutura básica de um aplicativo exemplo que será desenvolvido em C# com a base de dados em SQL Server.

 
<!--[if !vml]-->
<!--[endif]-->
Figura 1 - Camadas da Aplicação
 
 

Camada de Dados:

 
Também conhecida como camada de informações, responsável por maner os dados pertencentes ao aplicativo. Essa camada normalmente armazena dados em um sistema gerenciador de banco de dados relacional (SGBDR) (Deitel et al 2002).  No exemplo que é apresentado será utilizado o SQL Server 2005, nada impede que o leitor utilize outro, desde que adapte as strings de conexão e declarações de objetos na linguagem. É recomendável porém, que seja utilizado o SQL Server 2005 ou o SQL Server 2005 Express Edition.
 

Camada Intermediária:

 
A camada intermediária implementa a lógica de negócio e a lógica do controlador. Essa camada atua como intermediário entre os dados da camada de apresentação e os clientes do aplicativo. A lógica do controlador processa os pedidos do cliente e recupera do banco de dados. A lógica de negócios representam os métodos correspondentes as regras do negócio e garante que os dados sejam confiáveis, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados aos usuários. Exemplos:
<!--[if !supportLists]-->·        <!--[endif]-->Antes de gravar os dados de um cliente no banco de dados, na camada lógica de negócios, poderia haver uma regrar para checar se a data de nascimento do cliente por exemplo não é maior que a data atual.
<!--[if !supportLists]-->·        <!--[endif]-->Se os campos obrigatórios foram preenchidos com dados válidos, etc...,
Ou seja, as regras de negócio dizem como os usuários/clientes podem e não podem acessar dados do aplicativo e como os aplicativos processam os dados. (Deitel et al, 2002).
 

Camada de Apresentação:

 
Também conhecida como camada de interface com o usuário ou camada superior, que no caso do exemplo que será apresentado são os formulários tipo Windows, se fosse uma aplicação para Web seriam os navegadores. A camada de apresentação interage com a camada intermediária para fazer pedidos e recuperar dados da camada de dados. Então, a camada do cliente exibe para o usuário os dados recuperados pela camada intermediária.
 

Cenário

 

Sistema de Controle de Apólices de Seguros de Veículos

 
Este visto no Diagrama de ER representa um modelo simplificado de um sistema de controle de apólices de seguro para veículos automotores.
 
Ao examinar a Figura 2 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006) percebe-se:
 
a) Que um cliente para ser cliente efetivamente precisa possuir no mínimo uma apólice, podendo ter mais carros segurados, no entanto uma apólice pertence de forma exclusiva a um cliente.
 
b) Que uma apólice pode ser paga em várias parcelas. Que uma apólice refere-se a um veículo de um modelo determinado. E que esse mesmo modelo de veículo pode estar segurado em outra apólice de outro cliente.
 
c) Que um sinistro pertece a uma única apólice. Mas esta apólice pode ter uma ou mais sinistros ocorridos. Que o sinistro cadastrado pode ser de um tipo ou mais e representar vários danos.
 
Nota: Para fins didáticos este modelo está simplificado, faltam campos, poderíamos aplicar mais regras de normalização, como por exemplo a marca do veículo poderia estar em uma tabela separada e assim por diante. Porém isso foge ao escopo do objetivo principal que é o aprendizado do desenvolvimento em camadas.
 

Diagrama de Entidade Relacionamento

 
A Figura 2 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006) representa o Digrama de ER explicado anteriormente.
Figura 2 -Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006)

Objetivo do primeiro artigo:

 
Preparar a camada de dados, a qual será acessada pelos métodos da classe intermediária que representam a lógica do controlador, no caso do exemplo apresentado.
 

Mão na Massa

 
Inicie o Sql Server 2005 crie um banco de dados chamado seguros, Abra uma janela New Query e execute o script abaixo para a criação das tabelas já com os relacionamentos, se assim o desejar. Caso contrário, se desejar criar manualmente consulte o artigo anterior que escrevi sobre a camada de dados. No Link: 
 
Scripts para criação das tabelas. Nota: Não esqueça de criar o banco com o nome seguros, para facilitar o desenvolvimento do aplicativo nos próximos artigos.
 

USE SEGUROS

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbCliente]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbCliente](

[idCli] [int] NOT NULL,

[nomeCli] [nvarchar](50) NOT NULL,

[enderecoCli] [nvarchar](50) NULL,

[foneCli] [nvarchar](20) NULL,

[faxCli] [nvarchar](20) NULL,

[obsCli] [nvarchar](max) NULL,

CONSTRAINT [PK_tbCliente] PRIMARY KEY CLUSTERED

(

[idCli] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbDano]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbDano](

[idDano] [int] NOT NULL,

[descDano] [nvarchar](50) NULL,

CONSTRAINT [PK_tbDano] PRIMARY KEY CLUSTERED

(

[idDano] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbTipo]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbTipo](

[idTipo] [int] NOT NULL,

[descTipo] [nvarchar](30) NULL,

CONSTRAINT [PK_tbTipo] PRIMARY KEY CLUSTERED

(

[idTipo] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbModelo]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbModelo](

[idModelo] [int] NOT NULL,

[descModelo] [nvarchar](50) NOT NULL,

[descMarca] [nvarchar](50) NOT NULL,

CONSTRAINT [PK_tbModelo] PRIMARY KEY CLUSTERED

(

[idModelo] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbApolice]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbApolice](

[idApolice] [nvarchar](8) NOT NULL,

[idCli] [int] NOT NULL,

[kmVeiApolice] [int] NOT NULL,

[numApolice] [int] NOT NULL,

[dataApolice] [datetime] NULL,

[dataValApolice] [datetime] NULL,

[valorApolice] [float] NULL,

[idModelo] [int] NULL,

[sinistroApolice] [bit] NULL,

[idSinistro] [int] NULL,

CONSTRAINT [PK_tbVeiculoSegurado] PRIMARY KEY CLUSTERED

(

[idApolice] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbParcela]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbParcela](

[nroParc] [int] NOT NULL,

[idApolice] [nvarchar](8) NOT NULL,

[dataVenParcela] [datetime] NOT NULL,

[valParcela] [float] NOT NULL,

[quitadaParcela] [bit] NULL,

[quitadaData] [datetime] NULL,

CONSTRAINT [PK_tbParcela] PRIMARY KEY CLUSTERED

(

[nroParc] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbSinistro]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbSinistro](

[idSinistro] [int] NOT NULL,

[dataSinistro] [datetime] NOT NULL,

[descSinistro] [nvarchar](50) NOT NULL,

[idTipo] [int] NOT NULL,

[idDano] [int] NOT NULL,

CONSTRAINT [PK_tbSinistro] PRIMARY KEY CLUSTERED

(

[idSinistro] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbCliente]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH CHECK ADD CONSTRAINT [FK_tbApolice_tbCliente] FOREIGN KEY([idCli])

REFERENCES [dbo].[tbCliente] ([idCli])

GO

ALTER TABLE [dbo].[tbApolice] CHECK CONSTRAINT [FK_tbApolice_tbCliente]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbModelo]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH CHECK ADD CONSTRAINT [FK_tbApolice_tbModelo] FOREIGN KEY([idModelo])

REFERENCES [dbo].[tbModelo] ([idModelo])

GO

ALTER TABLE [dbo].[tbApolice] CHECK CONSTRAINT [FK_tbApolice_tbModelo]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbSinistro]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH NOCHECK ADD CONSTRAINT [FK_tbApolice_tbSinistro] FOREIGN KEY([idSinistro])

REFERENCES [dbo].[tbSinistro] ([idSinistro])

GO

ALTER TABLE [dbo].[tbApolice] NOCHECK CONSTRAINT [FK_tbApolice_tbSinistro]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbParcela_tbApolice]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbParcela]'))

ALTER TABLE [dbo].[tbParcela] WITH CHECK ADD CONSTRAINT [FK_tbParcela_tbApolice] FOREIGN KEY([idApolice])

REFERENCES [dbo].[tbApolice] ([idApolice])

GO

ALTER TABLE [dbo].[tbParcela] CHECK CONSTRAINT [FK_tbParcela_tbApolice]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbSinistro_tbDano]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbSinistro]'))

ALTER TABLE [dbo].[tbSinistro] WITH CHECK ADD CONSTRAINT [FK_tbSinistro_tbDano] FOREIGN KEY([idDano])

REFERENCES [dbo].[tbDano] ([idDano])

GO

ALTER TABLE [dbo].[tbSinistro] CHECK CONSTRAINT [FK_tbSinistro_tbDano]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbSinistro_tbTipo]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbSinistro]'))

ALTER TABLE [dbo].[tbSinistro] WITH CHECK ADD CONSTRAINT [FK_tbSinistro_tbTipo] FOREIGN KEY([idTipo])

REFERENCES [dbo].[tbTipo] ([idTipo])

GO

ALTER TABLE [dbo].[tbSinistro] CHECK CONSTRAINT [FK_tbSinistro_tbTipo]

 
Se tiver dúvidas em como executar esse script, siga os procedimentos abaixo indicados:
 
1) Na janela do Microsoft SQL Server Management Studio, clique com o botão direito do mouse sobre Databases, escolha New Database...

Figura 3 - New Database...
 
2) Na janela New Database, digite o nome do banco de dados, seguros e em seguida clique em OK.

 
Figura 4 - New Database: seguros
 
3) Na janela do Object Explorer, clique com o botão direito do mouse sobre o banco de dados criado (seguros) e escolha new query.

Figura 5 - Object Explorer  - New Query
 
4) Na janela query, copie script desse artigo e cole nessa janela. Em seguida clique no botão execute.

Figura 6 - Janela Query e Botão Execute

5)  Expanda no Object Explorer [+] o banco de dados seguro e clique sobre Database Diagram com o botão direito. Responda afirmativamente a caixa de diálogo para criar um novo diagrama.


Figura 7 - Novo Diagrama do Banco de Dados
 
6) Adicione todas as tabelas, para que fique parecido com a Figura 1 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006).
 
 

Conclusão

 
Nesse artigo que é o primeiro de uma série artigos os quais apresentam um exemplo prático e simples de um sistema de controle de apólices de seguro, abordando o desenvolvimento em camadas em C#.
 

Nota do Autor:

 
Em breve, disponibilizarei o segundo artigo, pois como as aulas estão retornando aqui na Faculdade o tempo está curto, nem parece que o dia tem 24 hoas. Bom, vida de professor é assim, preparar aulas e depois mais aulas. J
 
Qualquer dúvida quanto a esse artigo entre em contato pelo e-mail: professormoraes_arroba_gmail.com.

Referências Bibliográficas:

 
(Deitel et al, 2002) - DEITEL, H, M, DEITEL, P, J, LITSFIELD, J, A et all, “C#: How to program”, Prentice Hall, (2002).
 
(Guedes, 2006) -  GUEDES, GILLEANES T. A. – “UML - Uma Abordagem Prática”, Novatec, (2006).
 
 




    8 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Carlos
Continue com a série logo. Abraços.
[há +1 ano] - Responder

 

Marcos Roberto De Moraes
Abraços Carlos
[há +1 ano] - Responder
 

Letícia
Achei muito bom o artigo. Porém como sou niciante. Gostaria de ter mais detalhes para acessar o SQL no Visual Studio 2005. Onde posso ter essa informação?
[há +1 ano] - Responder
 

Marcos Roberto De Moraes
Você pode utilizar ao invés do SQL Server 2005. A versão que vem instalada junto com Visual Studio, SQL Server Express. Aqui no devmedia você encontra várias video aulas sobre o SQL Server. Qualquer coisa me mande um email professormoraes_arroba_gmail.com
[há +1 ano] - Responder
 

Ricardo Santa Lúcia
Parabéns por esse e pelos outros artigos.
[há +1 ano] - Responder

 

Claudio Stein Junior
Na hora que gera o script está faltando algumas chaves estrangeiras ou é assim mesmo? Abraços
[há +1 ano] - Responder

 

Marcos Roberto De Moraes [maromo]
Júnior, obrigado pela colaboração. Script corrigido.
[há +1 ano] - Responder

 

Vinicius Climaco
Ótimo seu artigo, não o conhecia do DevMedia, agora vou ler os outros artigos. Você usa essa tecnica de camadas no dia a dia, que vc fez no modelo de C#? Gostei desse modelo... bem facil... além de prático... Qualquer coisa me manda um e-mail pra viniclima@hotmail.com serve para MSN tbm, gostaria de trocar uma ideia sobre isso...
[há +1 ano] - Responder

 



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
Marcos Roberto De Moraes

Mestre em Educação pela UNISAL.
Especialista em Administração de Sistemas de Informação pela Universidade Federal de Lavras-MG (UFLA).
Licenciado pleno em informática pela Universidade Metodista de Piracicaba (UNIMEP).
Graduado em Tecnologia em Processamento de Dados pela Unipinhal.
...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
16   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03