Capítulo 5

No capítulo anterior criamos as classes que vão dar suporte às regras de negócio da nossa aplicação. Neste post, vamos criar a nossa camada de apresentação. Não pretendo aqui esgotar o assunto sobre isso, nem mesmo desenvolver todos os recursos do sistema. O que iremos fazer é dá uma idéia inicial sobre a comunicação entre as camadas e criar um protótipo 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 o RSClass – Gerador de Classes para gerar os códigos. Destaque para algumas bibliotecas que encapsulam funcionalidades ligadas ao NHibernate, visando diminuir a codificação e proporcionar 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 coorporativo que desenvolvo. Claro que a medida que vão surgindo outras necessidades, tanto as bibliotecas, quanto o RSClass – Gerador de Classes vão sofrendo adaptações. Por exemplo, desde quando comecei a escrever esta série algumas mudanças foram feitas no RSClass – Gerador de Classes e nas bibliotecas. 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 ontem.

Então vamos iniciar os trabalhos. Abra a nossa solução no Visual Studio na solução da agenda 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, inclusive web service. 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 Empty Web Application. Eu prefiro utilizar Web Application. 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 DLLs, 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 nos códigos-fontes da sua aplicação, enquanto no web site não tem como impedir diretamente. Teria que ser via sistema operacional. Enfim, veja o que é melhor. Fiquei com web application… Adicionei um projeto web application vazio com nome “AgendaTelefonica”. Aliás, tem que ser este nome por que o proxímo passo é usar o RSClass – Gerador de Classes que vai depender disso.

E este é o próximo passo: gerar um protótipo da aplicação pelo RSClass. Acesse o menu Gerar->Protótipo WebApplication e configure como mostrado a seguir:

O RSClass – Gerador de Classes vai gerar as páginas web correspondente a cada tabela. Essas páginas estarão com as opções de inclusão, alteração, exclusão e consulta completamente funcionais. Ainda no RSClass – Gerador de Classes, gere a classe BOAcces. Marque a opcão na tela principal e clique em °Gerar Classes”. Essa classe irá fazer as requisições à camada de negócio. Todas as chamadas à camada de negócio deverá ser feita através dessa classe.

De volta ao Visual Studio, os arquivos (e pastas) gerados precisarão passar por duas etapas:

  1. No projeto, clique em “Show All Files“, selecione todos os arquivos gerados (inclusive as pastas Images e Diversos), clique em um deles com o botão direito do mouse e selecione “Include In Project“.
  2. Agora, no Solution Explorer, selecione o projeto AgendaTelefonica e, no menu principal, clique em Project ->Convert to Web Application. Confirme a operação na caixa de diálogo. Esse processo irá criar um arquivo de designer para cada página ASP.NET da aplicação.

Ainda no Visual Studio, precisamos adicionar algumas referências em nossa aplicação web. Clique no botão direito do mouse sobre o nome do projeto e selecione “Add Reference…”. Selecione a guia Soluction/Project e, nessa guia, selecione os projetos BO, Interface e OR (não selecione o DAO, porque? lembra?) e clique em ‘OK’. Lembre da obediência a hierarquia em camadas que discutimos anteriormente. A camada de apresentação só pode fazer requisições à camada de negócio. Nunca à camada DAO. Lembra, também, da Regisoft Library.NET? Vamos precisar dela. Adicione as bibliotecas Regisoft.dll, Regisoft.web.dll e Regisoft.Web.UI.WebControls. São bibliotecas com recursos diversos: tratamento e validação de strings, 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, componentes da toolbox que eu adicionei alguns novos recursos e muito outros. Como voce já sabe, todas essas bibliotecas são encontradas na pasta onde voce instalou o RSClass – Gerador de Classes. E se quiser conhecê-las melhor, sugiro adquirir os fontes e verificar pessoalmente. Adicione, também, referência à biblioteca de componentes AJAX: AjaxControlToolkit.dll

Além dessas, vamos precisar da biblioteca que conecta o banco de dados Firebird: FirebirdSql.Data.FirebirdClient.dll. O NHibernate vai precisar dela pra fazer a conexão com o banco de dados da nossa aplicação. Por tanto adicione referência a ela também. Falando sobre o NHibernate, vamos falar um pouco sobre sua configuração. Está feita no arquivo Web.Config, presente na aplicação web. O RSClass – Gerador de Classes fez a configuração pra nós no momento que geramos o protótipo da aplicação. Dê uma olhada nesse arquivo. Adicionalmente existe a configuração da biblioteca de mapeamento. Fica como exercício, identificar no Web.Config essas configurações.

Finalmente defina no Visual Studio a página “Index.apx” como a página inicial. Clique sobre o arquivo e selecione a opção “Set As Start Page“. Clique também sobre o projeto web e selecione a opção “Set As Startup Project“. Voce está pronto a executar a aplicação e pode fazer isso. Quando abrir, não se preocupe com login e senha. Essa tela inicial é simulação. Pode digitar qualquer valor nesses campos que vai aceitar. Agora navegue pelas páginas geradas e veja como o RSClass – Gerador de Classes é poderoso. Faça algumas operações de inclusão, alteração e exclusão e verifique que tudo funciona. Volte às páginas no Visual Studio e analise o código ASP.NET e o código em C# correspondente. Entenda a estrutura dos códigos; os eventos, a estrutura das páginas, os componentes utilizados, etc.

É preciso ficar claro que o RSClass – Gerador de Classes não vai nem tem a intensão de gerar a aplicação inteira. Ele apenas gera uma estrutura mínima para que o programador começe a trabalhar. Aqui nós geramos um protótipo, mas a ferramenta pode gerar páginas individualmente com layout diversos. Além disso, o gerador tem alguns layouts que podem ser utilizados em lugar desse protótipo. Futuramente pretendo iniciar uma série de posts sobre o RSClass – Gerador de Classes visando aprimorar o conhecimento dos interessados na ferramenta. A intenção é apresentar dados técnicos de como melhor utilizar a ferramenta.

Uma vez iniciada a aplicação, possivelmente haja a necessidade de criar novos métodos em nossa regra de negócio. Vamos agora ilustrar como deve ser realizada essa operação seguindo a arquitetura da solução. A seguir, ilustramos 3 metódos com formas diferentes de fazer seleção de dados. O primeiro faz uma seleção a partir de um método herdado da classe BaseDAO. O segundo foi construído utilizando a linguagem do NHibernate, a HQL. O terceiro faz uma seleção utilizando um outro recurso do NHibernate chamado Critéria. Sempre que for inserir código nos DAOs certamente voce irá utilizar um dos três caminhos. Note que os métodos apresentados só tem o papel de selecionar dados do banco. Não existe qualquer validação ou regra de negócio nesses métodos. Entendido isso, pode, então adicionar as linhas em UfDAO.cs, uma vez que os métodos são relacionados à classe Uf.

public Uf SelecionarPorSigla(string sigla)
{
return this.SelecionarPor("Sigla", sigla);
}
public IList<Uf> ListarPorDescricao(string descricao)
{
string hql = @"select uf from Uf uf
where uf.Descricao like :descricao
order by uf.Descricao";
IQuery query = Get<ISession>().CreateQuery(hql);
query.SetAnsiString("descricao", descricao + "%");
return query.List<Uf>();
}
public IList<Uf> ListarPorSigla(string sigla)
{
ICriteria crit = Get<ICriteria>()
.Add(Expression.InsensitiveLike("Sigla", sigla, MatchMode.Start))
.AddOrder(Order.Asc("Descricao"));
return crit.List<Uf>();
}

Recaptulando, criamos 03 métodos DAO´s. Um com critéria, outro com HQL (Hibernate Query Language) e outro utilizando um método nativo da classe BaseDAO. Veja que o controle da sessão do Hibernate vem do Get<ISession>() e o critéria vem do Get<ICriteria>(). 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 NHibernate é bem facilitada. Abra tambem a interface IUfDAO.cs e adicione as seguintes linhas:

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

Qualquer novo método que for adicionado nos DAOs 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);
}
public IList<Uf> ListarPorSigla(string sigla)
{
if (sigla == string.Empty || sigla == null)
throw new ExceptionRS("Necessário informa a sigla");
return ufDAO.ListarPorSigla(sigla);
}

Na regra de negócio nos fazemos chamadas aos novos 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 coloque 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. Um detalhe: nem todos os métodos criados no DAO precisam ser expostos como métodos no BO. Só se deve fazer isso quando algum método criado no DAO necessitar ser utilizado na camada de apresentação. Em algum momento, um metódo no DAO pode ser criado apenas pra se utilizado no BO. Então não há necessidade de expor o método no BO. Mas, claro se tiver que expor para camada de apresentação, cria-se o metódo no BO e adiciona as referências na Interface correspondente. Como fizemos no IUfDAO.cs, vamos fazer o mesmo com IUfBO.cs. Abra-o e adicione as seguintes linhas:

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

No IUfBO já existe métodos declarados. São os métodos que podem ser chamados na camada de apresentação. Agora nós adicionamos mais 03 métodos para serem utilizados. 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: O RSClass – Gerador de Classes possui outros layouts de página para serem gerados. Cada layout tem uma finalidade bem definida. Em posts futuros estaremos falando sobre esses recursos.

Na pasta de instalação do RSClass – Gerador de Classes voce pode encontrar os arquivos deste tutorial gerados até aqui (PARTE VI).

É possível modificar os arguivos gerados para que os DAOs, BOs e banco de dados possam rodar em um servidor de aplicação em uma arquitetura distribuida. O servidor web e/ou outros programas desktop estariam executando em outras máquinas fazendo solicitações ao servidor que estaria executando as regras de negócio (servidor de aplicações). Mas isso é assunto para o próximo capítulo. Até lá.