face=Verdana size=2>img

Clique aqui para ler todos os artigos desta edição

Criando um Fórum de discussão

Utilizando MVC, Visual Studio e NHibernate

 

Normalmente eu estou acostumado a escrever sobre o desenvolvimento de aplicações com a utilização de DataSets tipados e TableAdapters. Esse é um modelo muito prático e simples de criar aplicações, e em certos aspectos é compatível com a Orientação a Objetos.

Porém, neste artigo tentaremos algo diferente. Vamos criar uma aplicação utilizando o NHibernate e respeitando à risca as regras do MVC. A aplicação que criaremos será um fórum para o lançamento de dúvidas e respostas a respeito de tecnologias de desenvolvimento. Para isso, utilizaremos ASP.NET no Visual Studio 2005.

 

MVC e Nhibernate

 

Orientação a Objetos é um assunto extenso e que possui diversas abordagens. Sempre ouvimos falar sobre OO sob o aspecto teórico e documental, com ênfase na UML e seus diagramas. Não há espaço neste artigo para cobrirmos todas as fases de análise e desenvolvimento de uma aplicação Orientada a Objetos, portanto vamos tentar ser o mais prático e objetivo possível no exemplo exposto aqui.

Antes de começarmos é muito importante entendermos claramente como funciona o MVC e que papel tem o NHibernate nisso tudo. O MVC é uma sigla que quer dizer Model View Controller, e representa uma metodologia de desenvolvimento Orientado a Objetos.

Como você pode conferir na Figura 1 o Model representa o modelo de classes da aplicação, o View representa a interface (Web, Windows etc.) e o Controller é a camada que faz a ligação entre o View e o Controller.

O NHibernate é a versão para .NET do framework de persistência chamado Hibernate e originalmente desenvolvido para Java. O NHibernate, como um framework de persistência, é responsávelpor fazer a ligação entre o modelo de

classes com um banco relacional.

De forma prática, através de um mapeamento objeto-relacional, o NHibernate gera todos os comandos SQL necessários para a aplicação, em tempo de execução.

Para que você consiga realizar os exemplos deste artigo será necessário baixar e instalar o NHibernate, que você encontra para download no endereço: www.hibernate. org/343.html. Neste artigo, foi usada a versão 1.2.0.GA.

Essa não é a verdade absoluta no desenvolvimento Orientado a Objetos, é apenas uma opção, que faz uso de um framework de persistência. Como qualquer modelo de desenvolvimento, ele possui pontos positivos e negativos.

O ponto positivo é o alto acoplamento e ortabilidade, que significa que podemos facilmente substituir o banco da aplicação (SQLServer, Oracle, MySql, Postgree, etc.) , assim como a interface (Web, Windows, Mobile, etc.).

O ponto negativo desse modelo é o trabalho, que pode aumentar significativamente. Neste artigo, inclusive, tentaremos minimizar ao máximo esse trabalho, para que fique o mais viável possível para ser implementado no dia-a-dia.

 

img

Figura 1. MVC e Nhibernate

 

Model

 

Quando você começa a desenvolver uma aplicação, por onde começa? Aposto que você respondeu banco de dados. A modelagem de um banco de dados é a forma mais popular de começar a desenvolver uma aplicação. Porém, na Orientação a Objetos devemos começar pela camada Model, ou pelo modelo de classes.

Tradicionalmente, quando estamos desenvolvendo pela Orientação a Objetos, devemos realizar toda a análise da aplicação passando pelos diagramas de: Caso de Uso, Mudança de Estado e Diagrama de Classes. Pela falta de espaço que temos aqui, vamos pular essa fase e focar o modelo no Diagrama de Classes. A diferença é que vamos modelar as classes diretamente no Visual Studio.

 

Criando o projeto Class Library

 

Sendo assim abra o seu Visual Studio 2005 e crie uma solução vazia chamada “Forum”. Para criar uma solução vazia, acesse o menu File>New>Project, expanda

a opção Other Project Types e selecione o item Visual Studio Solutions. Ao lado direito escolha o item Blank Solution, informe o nome da solução e clique em OK. É importante termos uma solução, pois representaremos cada uma das camadas da aplicação em um projeto separado.

Vamos começar criando o projeto que representará a camada Model. Clique com o botão direito sobre a solução e escolha a opção Add>New Project. Em Visual C# escolha o item Class Library, em Name informe “Forum.Model” e clique em OK. Um projeto do tipo Class Library foi criado na solução, feche e apague a classe Class1.cs, pois não vamos utilizá-la. E como disse anteriormente, vamos mode-

lar as classes pelo Visual Studio. Clique com o botão direito sobre o projeto que acabamos de criar e escolha a opção View Class Diagram, como mostra a Figura 2.

 

img

Figura 2. Visualizando o modelo de classes do projeto

 

Diagrama de Classes no Visual Studio

 

Será criado um arquivo chamado ClassDiagram1.cd onde podemos literalmente desenhar as nossas classes. É uma ferramenta bem interessante para a modelagem das classes, vamos, portanto, ao nosso modelo.

A aplicação que criaremos controlará um fórum de dúvidas a respeito de diversos temas sobre tecnologia. Dessa forma já podemos identificar a primeira classe da aplicação, que representará esses “temas”. Vamos chamar a classe de “Topic” (tópico).

Com o botão direito sobre uma área vazia do diagrama de classes, escolha a opção Add>Class (Figura 3). E na janela que aparecer (Figura 4) informe o nome da classe que estamos criando. A classe chamada Topic foi criada no diagrama, e o arquivo Topic.cs também foi criado no Solution Explorer.

 

img 

Figura 3. Criando uma nova classe no diagrama

 

img

Figura 4. Informando o nome da classe

 

 

Dando continuidade na modelagem, quais são as demais classes que precisaremos?

Como já definimos, o fórum será organizado por tópicos. Sendo assim os usuários cadastrarão as dúvidas dentro de um determinado tópico, e outros usuários poderão responder a mesma.

Para as dúvidas dos usuários, vamos criar uma classe chamada “Thread” (linha). Levando em consideração que cada dúvida gerará uma “linha” de discussão, esse é um nome bem apropriado. E para as respostas que forem lançadas vamos criar uma classe chamada “Post”. Assim como fizemos com a classe Topic, crie também as classes Thread e Post no diagrama de classes. Seu diagrama deverá estar parecido com a Figura 5.

 

img

Figura 5. As classes criadas no diagrama

 

img

Figura 6. Definindo Fields e propriedades da classe Topic

 

Propriedades, Fields e Métodos

 

Agora precisamos definir a estrutura de cada uma das classes. Clique na classe Topic e vá até a janela Class Details, que geralmente fica na parte inferior do diagrama. Veja que a partir dessa janela podemos definir os métodos, propriedades, Fields e eventos da classe.

Vamos começar criando os Fields e propriedades da classe Topic. Dê uma olhada na Figura 6. Temos três Fields e suas respectivas propriedades. Como de costume os Fields são declarados como private e as propriedades como public. Veja que temos um ID e um Name que são do tipo string. Veremos mais adiante porque estamos definindo o ID como string. E temos também um Field e uma propriedade chamada Threads do tipo IList.

Como veremos, através dessa propriedade é possível recuperar todas as Threads de um determinado Topic. Já que estamos na definição da estrutura da classe, vamos finalizar definindo os construtores e métodos da classe Topic. Começando pelos construtores (que são métodos), veja na Figura 7, que através da janela Class Detail você pode criar um novo construtor.

Crie dois construtores. Um não receberá nenhum parâmetro, e o outro receberá dois parâmetros: pID e pName. Veja que você pode definir os nomes e tipos dos parâmetros na janela Class Detail. Em seguida crie os demais métodos que estão demonstrados na Figura 7, que são: Delete(string pId), Persist, RetrieveObject(string pID), RetrieveObjects e Update.

Como você já deve estar imaginando, esses serão os métodos responsáveis por acessar os dados no banco através do NHibernate. Mais adiante veremos detalhadamente como implementar cada um desses métodos. Pronto, a classe Topic já está definida, vamos agora para a definição da classe Thread. Através da janela Class Details crie os Fields, propriedades, construtores e métodos demonstrados na Figura 8.

Nessa classe temos as propriedades: ID,

Date, Subject e User. Temos também uma propriedade chamada Posts que retornará todos os Posts da Thread. E adicionalmente também temos a propriedade Topic, que é exatamente do tipo Topic, classe que criamos anteriormente. Essa propriedade define claramente que uma Thread pertencerá a um determinado Topic.

Porém, se você verificar no diagrama, não encontrará nenhuma “linha” que ligue essas duas classes. Para que nosso diagrama fique visualmente mais adequado, na classe Thread, clique com o botão direito sobre a propriedade Topic e escolha a opção Show as Association. Você verá que a propriedade Topic será exibida como uma associação, assim como manda a UML.

Outra diferença que temos na classe Thread é que o RetrieveObjects recebe o parâmetro pTopic. Isso significa que esse método deverá retornar apenas as Threads de um determinado Topic. E para finalizar, crie a estrutura da classe Post, como mostra a Figura 9. Com isso o diagramade classes está pronto (Figura 10).

 

img

Figura 7. Definindo construtores e métodos da classe

 

img

Figura 8. Definição da estrutura da classe Thread

 

img

Figura 9. Definição da estrutura da classe Post

 

 

Codificando as classes

 

Como acabamos de ver, o diagrama de classes do Visual Studio é um recurso

muito interessante para modelarmos as classes, principalmente porque toda a estrutura das mesmas é gerada automaticamente, restando apenas codificar o conteúdo das propriedades, métodos e construtores.

Antes de começar a codificar as classes é importante que você já tenha instalado o NHibernate, pois nos métodos de persistência e acesso aos dados vamos utilizá-lo. Com o NHibernate instalado, adicione uma referência no Forum.Model apontando para o NHibernate.dll, que geralmente é instalado no diretório: C:\Arquivos de programas\NHibernate\bin\net-2.0\

Em seguida vamos começar abrindo a classe Topic.cs. Você pode abri-la pelo Solution Explorer ou simplesmente dando um duplo clique na classe dentro do diagrama. Comece incluindo os seguintes namespaces:

 

using System.Collections;

using NHibernate.Cfg;

using NHibernate;

using NHibernate.Expression;

 

Aproveite e inclua esses mesmos namespaces nas outras duas classes, assim ganhamos tempo. Como a codificação será muito parecida para as três classes, tudo que fizermos para a classe Topic faremos para as outras duas. E é claro, eu vou indicando as eventuais diferenças. Em seguida dê uma olhada na classe Topic e veja que toda a estrutura dela está criada, e dentro dos métodos e propriedades temos a seguinte linha de código:

 

throw new System.NotImplementedException();

 

Listagem 1. Construtores da classe Topic

                 #region Constructors

                  public Topic

{       

}

                  public Topic(string pID, string pName)

{

                  this.ID = pID;

                  this.Name = pName;

}

                 #endregion

 

Listagem 2. Construtores da classe Thread

                #region Constructors

                public Thread( )

{

}

                public Thread(string pID, string pSubject, string pUser, DateTime pDate,                                                                                      Topic pTopic)

{

                  this.ID = pID;

                  this.Subject = pSubject;

                  this.User = pUser;

                  this.Date = pDate;

                  this.Topic = pTopic;

}

                 #endregion

 

Listagem 3. Construtores da classe Post

                 #region Constructors

                  public Post()

{

}

                 public Post(string pID, DateTime pDate, string pUser, Thread pThread, string pText)

{

                 this.ID = pID;

                 this.Date = pDate;

                 this.User = pUser;

                 this.Thread = pThread;

                 this.Text = pText;

}

                 #endregion

 

Listagem 4. Propriedades da classe Topic

                  #region Properties

                   public String ID

{

                   get { return _ID; }

                   set { _ID = value; }

}

                   public String Name

{

                   get { return _Name; }

                   set { _Name = value; }

}

                   public IList Threads

{

                   get { return _Threads; }

                   set { _Threads = value; }

}

#endregion

 

img

Figura 10. Diagrama de classes da aplicação fórum

 

Codificando os construtores ...

Quer ler esse conteúdo completo? Tenha acesso completo