Visual Studio + NHibernate: Construindo aplicações em camadas – (cont. IV)

No post anterior criamos as classes e os mapeamento O/R do Hibernate. Vimos que essas classes farão o papel de transferir dados entre as camadas. Neste post vamos construir os DAO´s. Vamos definir os componentes que farão acesso ao banco de dados, ou seja, os DAO´s.

Vamos falar um pouco sobre alguns detalhes importantes neste processo. No post anterior indicamos um material sobre conhecimentos preliminares em relação ao Hibernate. Importante ter lido antes de continuar.

Nunca tive muita afinidade com a arquitetura cliente/servdor. Aquela onde existe um servidor de banco instalado em algum lugar da rede e as aplicações acessam diretamente este servidor fazendo requisições e persistindo dados. Esse processo é muito comum em Delphi e Visual Basic. Os programadores constroem um executável, embuntindo as regras de negócio e os comandos SQL no programa. Sempre achei isso meio complicado de gerenciar. E, de certa forma, é mesmo. Controle de transação, travamento de linhas, várias máquinas com o mesmo executável instalado e acessando o mesmo banco, etc. passam a ser preocupações do desenvolvedor que deve embutir soluções no programa. Mesmo usando o Delphi eu preferia separar alguns papéis. Eu fazia assim: a aplicação era responsável apenas por solicitar e exibir dados so servidor. As procedures do banco eram responsáveis para incluir, alterar e excluir dados (regras de negócio e DAO). Nenhuma aplicação poderia efetuar inserções, alterações ou deleções diretamente nas tabelas. Essas operações tinham que passar pelas procedures. As aplicações parametrizava dados e passava para a procedure. A aplicação permanecia aguardando o final da execução da procedure para saber se houve algum problema ou tudo foi realizado com sucesso. Nas procedures eram definidas regras da aplicação: validações, integridades, restrições, procedures paralelas (nada de triggers), etc. Inclusive acho isso muito bom. Não existe nada mais rápido pra banco de dados do que procedures. Eu disse NADA!!!!!!!!

Como nada é perfeito, tem um problema: se mudar a aplicação para outro banco as procedures teriam que ser reescritas!!!! Eu tinha uma aplicação mediana em SQL Server com mais de 200 procedures que teria que migrar para Oracle. Sem chances reescrever as procedures novamente. E se tivesse que mudar pra outro banco? Reescrever tudo outra vez?.

Neste cenário entrou o Hibernate! Com ele foi possível ganhar indepêndencia de banco de dados. Mas nem tudo são flores. As procedures do banco geram pouco tráfego de rede. O Hibernate gera auto nível de tráfego. Por isso é importante ter cuidado ao utiliza-lo. Sem falar em outras situações: gerenciamento de sessão, conectividade com outros bancos, HQL (o SQL do Hiberante), configurações, etc. Por tudo isso é importante planejar bem o seu uso. Dediquei um pouco do meu tempo a pesquisar e planejar. Construí uma biblioteca que gerencia inúmeras situações que acabam sendo repetitivas nas aplicaçãoes com Hibernate. Eu a chamei de Regisoft.Camadas. Ela faz parte de um pacote (Regisoft Library.NET) com outras bilbiotecas que utilizo no processo de desenvolvimento. Veja as classes que a biblioteca Regisoft.Camadas possui:

  1. NHibernateHelper – (Regisoft.Camadas.NHibernateHelper) Responsável por configurar e gerenciar o Hibernate dentro da aplicação. Inicialização das classes de mapeamento, gerenciamento da sessão, conectividade com um ou vários bancos de dados ao mesmo tempo são responsabilidades desta classe. Não precisa ser instanciada nem utilizada diretamente. Uma outra classe chamada BaseDAO fará uso desta classe internamente.
  2. BaseDAO – Todos os DAO´s devem herdar dessa classe abstrata. É um DAO genérico que é responsável por dar suporte, através de seus métodos e propriedades, ás operações envolvendo persistência: inserções, alterações, exclusões, transações, seleção de dados, validação de campos not-null, controle de objetos persistentes e transientes, verificação de integridade antes de uma exclusão e outras mais. Existe uma versão bem completa usando o Generic da versão .NET 2.0 (Regisoft.Camdas.Generic.BaseDAO<T,ID> ) e uma versão descontinuada sem Generic (Regisoft.Camadas.BaseDAO). A versão sem Genéric existe por compatibilidade retroativa. Aplicações desenvolvidas em Visual Studio 2003 utilizam esta versão (não valia a pena mudar).

Eu utilizo esta biblioteca em TODAS as aplicações que desenvolvo. Ela me permite abstrair da problemática do Hibernate. Não será diferente na nossa aplicação de Agenda Telefônica On-Line. Vamos gerar nossos DAO´s herdando da classe abstrata dessa biblioteca. Quem desejar escrever seu próprio BaseDAO ou sua própria biblioteca fique a vontade. Tem um post aqui que fala sobre as funcionalidades básicas que todo DAO genérico tem que ter. Leia mais… Uma novidade: o nosso BaseDAO também pode ser configurado para trabalhar numa arquitetura que faz uso de um ou mais servidores de aplicações. Clique aqui e saiba mais sobre essa possibilidade.

Clique aqui e baixe a bliblioteca. Vamos utiliza-lá em nosso projeto. ATENÇÃO: Voce deve renomear o arquivo baixado para .ZIP antes da descompactação. Não é um .DOC.

Utilizando a biblioteca assima não precisaremos escrever manualmente um DAO para cada tabela do banco. Podemos utilizar o MyGeneration para gerar os arquivos necessários. E vamos fazer isso agora. No segundo post sobre nosso assunto disponibilizei os scripts que são utilizados neste projeto e também a explicação de como utilizar o MyGeneration. Neste vamos repetir o processo utilizando dois scripts: DAO Class for Nhibernate.csgen e DAO Interface for Nhibernate.csgen.

Gerando as interfaces e os DAO´s

Abra o MyGeneration, efetue as confiurações necessárias se for o caso, abra, primeiramente, o script das interfaces:DAO Interface for Nhibernate.csgen. Execute o script preenchendo os campos como mostrado abaixo. Na selecção da pasta voce deve apontar para o local do projeto AgendaTelefonica.Interface e na pasta DAO.

Agora abra no MyGeneration o segundo script - DAO Class for Nhibernate.csgen. Vamos gerar os DAO´s. Note que a pasta destino deve ser a pasta onde o projeto AgendaTelefonica.DAO está hospedada. Quando executar o script voce deve entrar os dados da mesma forma que o fez para a geração das interfaces, modificando apenas a pasta destino. Veja a figura acima que é similar!!

No Visual Studio

Com os arquivos gerados nas suas respectivas pastas precisamos agora inclui-los em seus projetos. O Visual Studio precisa reconhece-los como parte do projeto. Os passos a seguir devem ser efetuados em cada projeto do Visual Studio, no local onde os arquivos foram gerados.

  1. Selecione o projeto. Se os arquivos gerados não tiverem aparecendo clique no botão “Show all Files“. Depois selecione os arquivos, clique em qualquer dos arquivos com o botão direito do mouse e selecione a opção “Include In Project“.

Chegou a hora de utilizar a nossa biblioteca. Voce terá que adicionar as bibliotecas que voce baixou aos projetos.

  1. Projeto AgendaTelefonica.DAO: Clicando com o botão direito do mouse sobre o projeto selecione “Add Reference…“. Selecione a aba Browse e localize as bibliotecas Regisoft.Camadas.dll, Regisoft.dll e Regisoft.Camadas.Interface.dll no local onde foi descompactada. Selecione-as e clique em Ok.
  2. Proejto AgendaTelefonica.Interface: Clicando com o botão direito do mouse sobre o projeto selecione “Add Reference…“. Selecione a aba Browse e localize as bibliotecas Regisoft.dll e Regisoft.Camadas.Interface.dll (não inclua neste projeto Regisoft.Camadas.dll) no local onde foi descompactada. Selecione-as e clique em Ok.

Se tudo foi feito como indicado o Solution Explorer estará como abaixo quando apresentar os projetos AgendaTelefonica.DAO e AgendaTelefonica.Interface.

Tecle Ctrl+F5 para montar o projeto. Se nenhum erro ocorrer voce concluio com sucesso essa etapa. No máximo, voce receberá uma mensagem informando que não há nenhum projeto que possa ser executado.

Vamos agora analisar os arquivos gerados.

  1. Abra primeiro o arquivo CidadeDAO.cs. Veja que não existe nada de extraordinário nele. Apenas 03 construtores diferentes na classe. O mais importante é a definição da classe que herda de uma BaseDAO<Cidade,long> e uma interface ICidadeDAO. A BaseDAO é a classe que implementa as funcionalidades de persistências que já estão prontas para serem usadas. Como é uma classe genérica estamos usando <Cidade,long> que diz que o DTO a que esta classe se refere é ‘CIDADE’ e diz também que possui um campo chave primária do tipo ‘long’. É provável que precisemos de algumas novas funcionalidades na classe CidadeDAO.cs mas iremos adiciona-la depois. O principal (inclusão, exclusão, alteração, seleções de dados, transações, ect.) já está disponível pela herança. Abra também a classe ICidadeDAO.cs e veja que lá também não existe nada de mais. Apenas as herança de outra interface genérica.
  2. Abra agora o arquivo DAOFactory.cs. Este será o arquivo por onde as regras de negócio farão acesso aos DAO´s. Voce entenderá isso melhor quando trabalharmos na geração dos BO´s. Veja que também possui uma inteface na sua declaração. Veja que seu construtor possui maneiras para acessar os DAO´s: com ou se servidor remoto. É possível planejar este sistema paraexecutar DAO´s e banco de dados numa máquina, regras de negócio em outra e servidor web em outra. Mas isso não faz parte do escopo do nosso projeto. Quem desejar conhecer mais sobre este assunto aguarde post posteriores ou registre algum comentário. Por hora voce deve entender que os DAO´s permitem flexibilidade de acesso graças a sua estrutura e o factory dos DAO´s sabe disso, permitindo que o programador escolha a forma de acesso que deseja trabalhar. Mas abaixo no arquivo voce vê exatamente os construtores dos DAO´s sendo chamados de acordo com aqueles construtores que mostramos no item 1, na classe CidadeDAO.cs que usamos como exemplo. O mais importante na nossa arquitetura é saber que os chamados aos DAO´s serão feitos através deste Factory (um padrão de projeto).

Estude bem este processo e os arquivos gerados. No próximo post vamos gerar os BO´s com suas interfaces. O procedimento é similar ao utilizado na geração dos DAO´s e suas interfaces. Estamos abertos a dúvidas e sugestões.

Se voce gostou e deseja ter os fontes dessas bibliotecas clique aqui. Conheça uma forma de adquirir ajundando a manter nossas pesquisas.

Até o próximo.

7 Respostas para “Visual Studio + NHibernate: Construindo aplicações em camadas – (cont. IV)”


  1. 1 Altenor Jr 02.07.2008 às 0:56

    Amigo, está simplesmente espetacular. Quando é o próximo post? Terias como me adiantar o conteúdo?

    =D

    Agradecido

  2. 2 Célio Assis 16.07.2008 às 15:31

    Ola Reginaldo,

    Os seus posts estão muito dez, tomei a liberdade de tentar prosseguir sozinho utilizando os seus scripts para BO e WEB só que esbarrei na biblioteca Web que vc desenvolveu, pois ela não veio junto com o pacote de bibliotecas disponibilizado, nem sei se deveria :) mas se vc puder me mandar por email ou posta aqui, fico agradecido.

    Grande Abraço.

  3. 3 Aprendiz de Feiticeiro 01.12.2008 às 18:24

    Gostei muito do post, vc detalha muito bem sobre o assunto!
    Devia escrever livros sobre esse tipo de conteúdo !!!
    Os livros atualmente perdem feio para o seu post, imagina um livro escrito por vc, ficaria ótimo!

    Tchau!!!

  4. 4 reginaldojr 01.12.2008 às 21:51

    olá, Aprendiz…

    Que bom que gostou. Possívelmente o diferencial seja que escrevo apartir de experiência prática. Gostei da sugestão de escrever um livro sobre esses assuntos. Vou amadurecer a idéia. Obrigado pelo insentivo.

  5. 5 William 02.02.2009 às 12:56

    Boa Tarde.
    Meu nome é William, estou terminando minha POS em Engenharia de Software. Estou fazendo minha monografia a respeito de ORM. Tenho que implementar um projeto exemplo, mostrando as diferenças entre 3 frameworks diferentes. Escolhe o NHibernate e pesquisando na net cheguei no seu site. Acabei de dar uma olhada na sua materia e achei muito interessante mas ainda não consegui ler por completo. Gostaria de saber se com esse conteudo que vc passou vou conseguir fazer um projeto teste (pequeno) para minha monografia? Vc indicaria algum outro site que tenha um bom conteudo em portugues para me indicar?

    Agradeço a atenção …

    William

  6. 6 reginaldojr 05.02.2009 às 23:00

    Olá, William.

    Dá pra fazer sim. Inclusive a sequencia do artigo propõe a construção de uma pequena agenda. Essa construção serve de base pra qualquer outro projeto. Materias sobre NHibernate tem poucos. Procuro material do hibernate que é o irmão gêmio do NHibernate. Vai achar muita coisa.

    Reginaldo Jr.

  7. 7 kelly 17.06.2009 às 12:40

    Olá Reginaldo!

    Td bem?

    Aonde consigo o script das interfaces:DAO Interface for Nhibernate.csgen e o segundo script – DAO Class for Nhibernate.csgen depois como faço?add os script no MyGeneration ?
    como faço?


Deixe um comentário




Calendário

Junho 2008
D S T Q Q S S
« Mar   Jul »
1234567
891011121314
15161718192021
22232425262728
2930  

Desde (04/11/07)

  • 34,786 visitas