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 nos códigos-fontes da  sua aplicação, enquanto no web site não tem como impedir diretamente. Teria que ser via sistama operacional. Enfim, veja o que é melhor. Fiquei com web application… Adicionei projeto web application com nome “AgendaTelefonica”. 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.  Como voce já sabe, todas essas bibliotecas são encontradas na pasta ‘Bibliotecas‘ no local onde voce instalou o RSClass.

Para quem tiver alguma dúvida, o arquivo web.config pode ser encontrado no site do tutorial (http://tutorialagendatelefonica.googlecode.com). 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 (na pasta ‘Bibliotecas’ no local de instalação do RSClas. 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 ;)

Mas algumas considerações na configuração do NHibernate. No web.config há informações sobre o banco de dados (driver, dialect, conecctionstring, etc.). Como estamos utilizando o Firebird precisamos adicionar o driver do banco ao sistema. Clique no projeto web com botão direito do mouse e selecione ‘Add Reference…‘. Localize o arquivo FirebirdSql.Data.FirebirdClient.dll que está na pasta ‘Bibliotecas’ no local de instalação do RSClass e adicione ao projeto. Outro arquivo que também terá que adicionar ao projeto web é o NHibernate.ByteCode.Castle.dll. Nessa nova versão do NHibernate ele precisa desse arquivo. Ainda não li sobre a utilidade. Mas devemos adicionar se não o NHibernate não irá funcionar. Quem souber da utilidade deste arquivo e quiser contribuir eu agradeço.

Se tudo foi feito corretamente teremos a seguinte tela (mais ou menos assim):

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 RSClass 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 gerar como tabela simples. No RSClass acesse o menu Webform->Tabela. Configure como mostrado abaixo.

gerar_webformtabela

Algumas informações importantes sobre essa geração de páginas:

  1. Na pasta destino voce pode selecionar o local do deu projeto onde quer que seja gerado os arquivos. Pode ser na principal ou em subpastas do seu projeto;
  2. Atenção para isso: o título da página deve ser informado sem acentuação e cedilhas. Os acentos só devem ser colocados quando a página for incluída no projeto e convertida em web application. Veremos isso mais tarde;
  3. No campo arquivo é o nome do arquivo a ser gerado. Não coloque extensão. O próprio RSClass irá fazer isso.
  4. A namespace é formada pelo nome do projeto (no nosso caso AgendaTelefonica) e pelas pastas internas onde o arquivo será gerado separado por ponto(.). Exemplo se voce gerar dentro de um projeto Estoque na pasta interna Almoxarifado a namespace deve ser Estoque.Almoxarifado;
  5. Selecione a tabela;
  6. Se voce pretende usar uma master page na página geraada marque a última caixa. A página será gerada com estrutura de WebForm Content. No nosso exemplo não estamos utilizando.

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 UnidadesFederacao.aspx com o botão direito do mouse e selecione “Convert to Web Application“.

Vamos gerar agora a classe de acesso aos BO´s. Como já dissemos anteriormente vamos utilizar uma arquitetura em camadas sendo que os acessos aos componentes da camada inferior serão feitos por uma única via. Abra o RSClass e no menu Gerar->BOAccess.cs gere o arquivo.  Usando o mesmo procedimento do parágrafo acima inclua o arquivo no projeto (Include in Project).

Defina a página UnidadesFederacao.aspx como “Set As Start Page” e execute a aplicação. Vamos ver se funciona…

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

  1. Normalmente eu crio sistema com controle de acessos. E este, como foi definido nos requisitos inicias, também deve ter. Deveriamos ter feito primeiro o controle de acesso ao sistema num tela de login. Mas como o objetivo é didático pulamos esta etapa. Então vamos comentar algumas lihas da nossa primeira página. No método protected void Page_Load(object sender, EventArgs e) da página comente as linhas if (u == null) e
    Response.Redirect(“~/Index.aspx”); Voce sabe. Comentar é adicionar duas barras (//) na frente da linha.
  2. Eu também constumo desenvolver sistemas que eu chamo multi-empresa. São sistemas que podem ser utilizados por várias empresa ao mesmo tempo. Uma sem acessar os dados da outra. Nesse caso no cadastro do usuário é definido a que empresa ele pertence. Assim no momento das listagens e outra operações é informado ao sistema a empresa do usuário e as operações só serão executadas em dados dessa empresa. Esse não é o nosso caso. Então localize no sistema a o método protected DataTable getDataTable(). Altere a linha IList<AgendaTelefonica.OR.Uf> lst = BOAccess.getBOFactory().UfBO().Listar(u.IdEmpresa) para IList<AgendaTelefonica.OR.Uf> lst = BOAccess.getBOFactory().UfBO().Listar(“Sigla”). Veja que a única coisa que mudou foi o parâmetro do método ‘Listar‘ que era ‘u.IdEmpresa‘ e passou a ser ‘Sigla‘.

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:

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>();
}

Veja que 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 Hibernate é 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 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);
IList<Uf> ListarPorSigla(string sigla);

Note que algumas linhas já estão lá definidas assim como no UfBO.cs e IUfBO.cs. Essas linhas foram adicionadas pelo RSClass.

Se desejarmos utilizar esses novos métodos na camada de apresentação precisamos primeiro declará-los na camada de negócio. Isso para obedecer a hirerarquia entre as camadas. Vamos faze isso. Abra o UfBO.cs e adicione os seguintes métodos:

public Uf SelecionarPorSigla(string sigla)
{
return ufDAO.SelecionarPorSigla(sigla);
}
public IList<Uf> ListarPorDescricao(string descricao)
{
return ufDAO.ListarPorDescricao(descricao);
}
public IList<Uf> ListarPorSigla(string sigla)
{
return ufDAO.ListarPorSigla(sigla);
}

Também será necessário acrescentar algumas linhas na interface IUfBO.cs:

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

Lá já tem várias 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 possui outros layouts de página para serem gerados. Cada layout tem uma finalidade bem definida. Para mais informações acesse http://rsclass.wordpress.com.

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

Deixo como exercício para o leitor implementar as outras páginas e recursos do site de acordo com a especificação inicial. Também me coloco a disposição para tirar dúvidas, dar treinamento, sugestões,  etc. Veja a página de Contato e sabia como me localizar. Acesse http://tutorialagendatelefonica.googlecode.com para baixar o código-fonte completo deste tutorial.

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.

5 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 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.

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

    Reginaldo,

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

  4. 4 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?

  5. 5 Eduardo Gama 11.11.2009 às 13:52

    Reginaldo boa tarde. Gostei muito do seu artigo e estarei utilizando em um projeto aqui na Empresa.

    Porém gostaria de saber se você criou algum script que gere as camadas BO – DAO e as interfaces BO – DAO das VIEWS?, pois seu scripts geram somente de tabelas.

    Obrigado e parabéns pelos artigos.


Deixe uma resposta




Categorias

Arquivos

Calendário

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

Desde (04/11/07)

  • 46,608 visitas