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

No post anterior criamos as classes que vão dar suporte às regras de negócio da nossa aplicação. Neste post, que é o último desta série, vamos criar a nossa camada de apresentação. Não pretendo aqui esgotar o assunto sobre isso, nem mesmo desenvolver todas as telas do sistema. O que iremos fazer é dá uma idéia inicial sobre a comunicação entre as camadas e criar uma página web que possa servir de base para o trabalho do desenvolvedor.

Até o momento tudo que fizemos foi puramente conceitual. E, de posse dos conceitos, utilizamos scripts para gerar os códigos. Destaque para algumas bibliotecas que encapsulam funcionalidades ligadas ao Hibernate, visando diminuir codificação e ganho em reaproveitamento de código. Daqui pra frente quem manda é a critatividade e a prática do programador para desenvolver a aplicação de acordo com os requisitos de sistemas definidos no projeto. Eu considero que é deste ponto que se inicia o trabalho de codificação efetivamente, visto que, até o momento, utilizamos geradores de código para criar as camadas que darão suporte a nossa aplicação. Eu utilizo essa prática em todo sistema corporativo que desenvolvo. Claro que a medida que vão surgindo outras necessidades, tanto as bibliotecas, quanto os scripts vão sofrendo adaptações. Por exemplo, desde quando comecei a escrever esta série algumas mudanças foram feitas nos scripts bem como na biblioteca. Isso é fácil de entender: a medida que vamos trabalhando, vamos aprendendo e aprimorando nossos hábitos e conceitos. Isso faz parte do ser humano: fazer hoje, melhor que ontém.

Então vamos iniciar os trabalhos. Abra a nossa solução no Visual Studio e adicione um novo projeto. Uma vez me perguntaram se este projeto poderia ser em windows forms. Claro que sim. Pode ser qualquer projeto de GUI: web, windows forms ou console. A camada de apresentação é o local onde o usuário final irá interagir com seu sistema. Quem define isso é o documento de requisitos. No nosso caso será um projeto web. Adicione um web site ou um web application. Eu prefiro utilizar web application e com suporte a AJAX. Qual a diferença? Bom… Eu começei no VS 2003 e ele já utilizava o conceito de web application. Eu gostava porque os arquivos .cs não precisavam ser colocados no site em produção. Ele gerava uma única .dll que implementava todas as classes. No web site, temos que colocar em produção os arquivos .cs que serão compilados, gerando as dll’s, em tempo de execução. Vantagem e desvantagem: Na web application qualquer modificação precisa ser recompilada. No web site modificações podem ser feitas diretamente no arquivo em produção. A compilação será feita automaticamente. Por outro lado, na web application tem como evitar a ação de pessoas não autorizadas na sua aplicação, enquanto no web site não tem como impedir diretamente. Enfim, veja o que é melhor. Fiquei com web application… Adicionei projeto web application com nome “AgTel”. O Visual Studio gerou os arquivos.

Primeira coisa a fazer é configurar o Hibernate. Vamos utilizar o web.config para isso. Essa configuração vai dizer ao NHibernate qual banco de dados estamos utilizando e onde ele está (usuario, senha, dialeto, tipo de banco, etc.). Uma outra informação que eu coloco neste arquivo é o nome do assembly O/R. Quem vai ler esta informação é a bilbioteca Regisoft.Camadas.dll para configurar o mapeamento do Hibernate.  Neste arquivo, em nossa aplicação e relacionado ao Hibernate, não mexeremos mais neste arquivo. A menos que desejemos fazer alguma mudança ou adicionar algum recurso novo, como por exemplo, se desejarmos trabalhar como servidor remoto. Mas isso é assunto de outros posts.

Precisamos adicionar algumas referências em nossa aplicação web. Clique no botão direito do mouse sobre o nome do projeto que acabamos de adicionar e selecione “Add Reference…”. Selecione a guia project e, nessa guia, selecione os projetos BO, Interface e OR (não selecione o DAO) e clique em ‘OK’.. Lembre da obediência a hierarquia em cadamas que discutimos anteriormente. A camada de apresentação só pode fazer requisições à camada de negócio. Nunca à camada DAO. Lembra da biblioteca Regisoft.dll? Adicione ela também. Mas duas bibliotecas serão necessárias: Regisoft.web.dll e Regisoft.Web.UI.WebControls. A primeira possui recursos para manipulação de javascript, limpeza automática de campos da tela, atribuição automática de valores dos objetos O/R a campos da tela, etc. A segunda são alguns componentes da toolbox que eu adicionei alguns novos recursos.

Clique aqui e baixe as bibliotecas. Vai junto também o web.config para quem tiver alguma dúvida. Após download e descompactação (renomei antes de descompactar para .ZIP), salve junto com as outras que utilizamos anteriormente. No projeto adicione as duas novas bibliotecas como referência no projeto. A Regisoft.Web.UI.WebControls.dll deve ser adicionada também na Toolbox do Visual Studio para facilitar. Para fazer isso clique com botão direito do mouse em qualquer lugar da Toolbox e selecione “Add Tab“. Dê um nome: “Regisoft”. Clique ainda com botão direito dentro da tab criada e selecione “Choose Items…“. Quando a janela aparecer clique em “Browse” e localize a biblioteca Regisoft.Web.UI.WebControls.dll. Confirme… Pronto! Os componentes foram adicionados. Abra a página Default.aspx e veja que na tab “Regisoft” possui alguns componentes. Inclusive essa é a maneira de adicionar webcontrols na Toolbox. Toda vez que voce baixar um componente visual pode adicioná-lo na toolbox dessa forma – Dica.NET ;)

Se tudo foi feito corretamente teremos a seguinte tela:

Já estamos com nosso ambiente preparado para iniciar os trabalhos. Vamos criar nossa primeira página web. Faremos uma página para inclusão de UF. Há quem ache que não precisa. Basta popular o banco de dados com essas informações, já que as UF não mudam constantemente. Eu concordo. Mas vamos construir para fins didáticos. Pra não perder a prática utilizaremos o MyGeneretion e um dos nossos scripts pra facilitar o trabalho. Não iremos nos preocupar com aparência da página fica como exercício para os interessados.

Como não é uma tabela com muitos dados vamos utilizar o script “WebFormTabela.csgen“. Utilize este script no MyGeneration e gere os arquivos na pasta do projeto web. Selecione UF dentre as tabelas do banco.

No Visual Studio, clique em “Show All Files“, selecione os dois arquivos gerados, clique em um deles com o botão direito do mouse e selecione “Include In Project“. Agora, clique em TabelaUf.aspx com o botão direito do mouse e selecione “Convert to Web Application“. Defina a página TabelaUf.aspx como “Set As Start Page” e execute a aplicação. Vamos ver se funciona…

Pra variar, PROBLEMAS!!!!! Vamos as correções:

  1. Se voce baixou as atualizações dos scripts e bibliotecas do post anterior e está utilizando, terá que gerar os DAO´s novamente. ATENÇÃO: NÃO GERE POR CIMA. APAGUE-OS E GERE NOVAMENTE.
  2. No projeto AgTel adicione referencia à bilbioteca do Firebird (FirebirdSql.Data.FirebirdClient.dll) que pode ser conseguida diretamente no site do Firebird. Após a adição, clique com botão direito do mouse sobre a referência adicionada e selecione “Properties”. Modifique a propriedade “Copy Local” para true. Se voce utilizar outro banco deve fazer a mesma coisa: adicionar o client do seu banco ao projeto. Sendo SQL Server ou Oracle isso não será necessário. Na realidade, este passo depende do banco que voce está utilizando e a forma que voce configurou o Hibernate para acessar este banco.
  3. No projeto BO é necessário adicionar referência de duas bibliotecas: Regisoft.dll e Regisoft.Camadas.Interface.dll
  4. No projeto AgTel crie uma pasta chamada Diversos. Nesta pasta voce deve utilizar o MyGeneration com o script BOAccess Class for Nhibernate.csgen para gerar a classe de acesso aos DAO´s. Durante a geração da classe pelo MyGeneration: em using escreva AgendaTelefonica.OR e em namespace escre AgTel. No Visual Studio selecione o arquivo e “Include In Project“.  Mas este script possui alguns erros que só identifiquei enquanto preparava este post. No post anterior, os arquivos para download foram substituídos por versões corrigidas.
  5. No arquivo TabelaUf.aspx.cs adicione na seção de using: using AgendaTelefonica.BO;
  6. Substitua a linha 46 por IList<Uf> lst = BOAccess.getBOFactory().UfBO().Listar(”Sigla”);
  7. Substitua a linha 91 por o = bo.UfBO().InserirAlterar(o, op);
  8. Substitua a linha 129 por BOAccess.getBOFactory().UfBO().Excluir(lst); Essas 03 últimas modificação removem a informação de usuário dos parâmetros de entrada dos métodos. Essa informação serviria para que, na regra de negócio, houvesse validação de permissões do usuário. Removi apenas para fins de testes na página.
  9. Comente a linha 26, 27 e 28, também removendo informação de login de usuário. Eu guardo a informação de login na sessão. Quando a sessão expira o usuário deve efetuar login novamente.;
  10. Para nosso exemplo, foi necessário fazer modificações no script do banco. Um novo script foi substituído no primeiro post dessa série. Nada muito complexo. Apenas incluí dois Generator no banco: Um para auto-numeração do cadastro de cidades e outro para auto-numeração do cadastro de UF.

Depois dessas modificações a página já pode ser testada. Note e a página é bem simples e complatemente funcional. Seria interessante adicionar alguns recursos visuais com CSS ou coisas do tipo. Mas não é objetivo deste material.

A verdade é que os geradores de código não resolvem todos os problemas. Mas adiantam bastantes. Com algumas modificações podemos ter ótimos resultados. Imagine se tívessemos que escrever tudo do zero…

Vamos agora ilustrar a adição de métodos de acesso a dados no DAO. Abra o UfDAO.cs e adicione as seguintes linhas:

/// <summary>
/// Selecionar uma UF através da sigla
/// </summary>
/// <param name=”sigla”>Sigla para pesquisa</param>
/// <returns></returns>
public Uf SelecionarPorSigla(string sigla)
{
ICriteria crit = getCriteria()
.Add(Expression.Eq(”Sigla”, sigla));
return crit.UniqueResult<Uf>();
}
/// <summary>
/// Listar UF´s que iniciem por uma string
/// </summary>
/// <param name=”descricao”>Descrição inicial para filtro</param>
/// <returns></returns>
public IList<Uf> ListarPorDescricao(string descricao)
{
string hql = @”select uf from Uf uf
where uf.Descricao like :descricao
order by uf.Descricao”;
IQuery query = getSession().CreateQuery(hql);
query.SetAnsiString(”descricao”, descricao + “%”);
return query.List<Uf>();
}

Veja que criamos dois métodos DAO´s comentados. Um com critéria e outro com HQL (Hibernate Query Language). Veja que o controle da sessão do Hibernate vem do getSession() e o critéria vem do getCriteria(). Ambos implementados no BaseDAO. Veja também que com a utilização da nossa bilbioteca a construção de métodos de acesso a dados com Hibernate é bem facilitada. Abra tambem a interface IUfDAO.cs e adicione as seguintes linhas:

Uf SelecionarPorSigla(string sigla);
IList<Uf> ListarPorDescricao(string descricao);

Qualquer novo método que for adicionado nos DAO´s deverá também adicionar a declaração na interface correspondente. Agora abra o UfBO.cs e adicione as seguintes linhas:

public Uf SelecionarPorSigla(string sigla)
{
if (sigla == string.Empty || sigla == null)
throw new ExceptionRS(”Necessário informa a sigla”);
return ufDAO.SelecionarPorSigla(sigla);
}
public IList<Uf> ListarPorDescricao(string descricao)
{
if (descricao == string.Empty || descricao == null)
throw new ExceptionRS(”Necessário informa a descricao”);
return ufDAO.ListarPorDescricao(descricao);
}

Na regra de negócio nos fazemos chamadas aos nóvos métodos do DAO. Adicionamos uma pequena regra que determina que os parêmetros de entrada não podem ser vazio ou nulos. Todas essas validações podem ser colocadas aqui. Eu diria que DEVEM. Mas há quem coloquem apenas na página web através dos componentes ASP.NET de validações. Eu costumo validar os dados de entrada tanto na tela com os componentes de validação, quanto no objeto de négocio. Isso por que caso eu esqueça de validar na tela de entrada certamente no objeto de negócio uma excessão será gerada.

Como fizemos no IUfDAO.cs, vamos fazer com IUfBO.cs. Abra-o e adicione as seguintes linhas:

Uf SelecionarPorSigla(string sigla);
IList<Uf> ListarPorDescricao(string descricao);

Note que algumas linhas já estão lá definidas assim como no UfBO.cs. Essas linhas foram adicionadas pelos scripts do MyGenerator.

Após estes procedimentos os novos métodos já estão disponíveis para utilização na página. Fica como exercício: modificar a página para localizar dados por descrição. Dica: existe um script chamado WebFormCadastro.csgen que gera um outro layout de página que foi desenhado para utilizar essas pesquisas. Após a geração dos códigos algumas modificações como fizemos na nossa página serão necessárias.

É possível modificar os arguivos gerados para que os DAO´s, BO´s e banco dados possam rodar em um servidor de aplicação, equanto que o servidor web e outros programas desktop possam rodar em outra máquinas fazendo solicitações ao servidor. Mas isso é assunto de posts futuro.

CONCLUSÃO

Desenvolver sistema é um trabalho desgastante. Mas este desgaste pode ser bem diminuido. Padrões de projetos, geradores de código, pesquisas e toda a engenharia de software podem ser aliados nessa tarefa de desenvolver bons programas.

Aproveito para indicar nossa área de Sistemas c/ Fontes. Adiquira um projeto completo para auxiliar no seu estudo e contribuir em nossas pesquisas.

Desde já agradeço a todos e até os próximos.

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


  1. 1 Edson 13.08.2008 às 16:16

    Cara, teria alguma outra forma de se ler o arquivo de Configuração nHibernate sem ser pelo Web.Config?
    A questão é que estou tentando implementar este padrão no ASP.NET MVC do VS 2008, teria algum impeditivo pra isso?

  2. 2 reginaldojr 13.08.2008 às 16:29

    Oi.

    Tem sim. Peça pelo email que eu te mando um arquivo de configuração do hibernate que pode ser usado em opção ao web.config.

  3. 3 Jadir Rodrigues Silveira 18.08.2008 às 11:00

    Caro Reginaldo,

    Confome orientado neste post, eu criei a aplicação web, e quando eu tento adicionar as referencias dos projetos BO, Interface e OR na guia Project não aparece nada, ela esta em branco, o que eu devo fazer.

  4. 4 reginaldojr 18.08.2008 às 21:17

    Jadir,

    Se voce seguiu todos os passos dos 6 posts não deveria ter problemas. A criação do projeto web deveria ser incorporado a solução. Isso na versão Visual Studio 2005 Profissional. Se voce tiver usando uma versão express voce realmente não tem como adicionar os projetos. Voce deve então gerar as .dll no Visual C# e depois abrir o Visual Web Developer e adicionar as .dll pela guia browser.

  5. 5 Jadir Rodrigues Silveira 18.08.2008 às 21:40

    Reginaldo,

    Eu estou usando o Visual Studio 2008, deve ser por isso então.

  6. 6 reginaldojr 18.08.2008 às 21:47

    Jadir,

    Tive contato apenas com as versões express do VS 2008. E nela, até onde eu vi, não dá pra juntar projetos web com projetos de bibliotecas de classes na mesma solução. Voce teria que criar as bibliotecas no Visual C# e criar o projeto web no Visual Web Developer, vinculando as .dll das bibliotecas de classes. Acho que é isso.

  7. 7 kelly 12.06.2009 às 15:53

    Reginaldo td bem??

    Ñ sei si vc lembra de mim, sou a Kelly que comprou um código fonte do Banco de Currículo lembra?rs…
    Reginaldo pq qria uma ajuda sua, tenho uma amigo de trabalho que esta com problema com Nhibernate em relação de inconsistência dados,mais falei pr Leandro enviar um email com mais detalhe assim que poder da uma mãozinha pr gnt?


Deixe um comentário




Calendário

Agosto 2008
D S T Q Q S S
« Jul   Jan »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Desde (04/11/07)

  • 34,786 visitas