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

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (25)  (0)

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).
 
 
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?