DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da .net Magazine DIGITAL ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!


Mapeamento por Convenção no NHibernate com o ConfORM - Revista .net Magazine 89

Esse artigo mostra o que é e para que serve o ConfORM, um framework que permite o mapeamento por convenção no NHibernate, eliminando a necessidade de ter um arquivo XML ou uma classe (C# ou VB.NET) de mapeamento para cada entidade do modelo de n






No desenvolvimento de aplicações de negócio sempre se tem uma grande preocupação com a produtividade do desenvolvimento, que impacta principalmente no tempo que é gasto com a manutenção dessas aplicações.

A orientação a objetos proporciona uma enorme produtividade se comparada com métodos utilizados em linguagens que não adotam essa filosofia. Uma de suas características que mais exemplifica o ganho de produtividade é a reutilização de código dentro de um projeto.

Quanto mais se aplica os conceitos básicos da orientação a objetos em uma aplicação, mais código é reutilizado, mais produtividade se ganha e mais fácil é dar manutenção nesse aplicativo.

Mas isso nem sempre é uma verdade absoluta em um projeto de software. Por mais que se tente reutilizar e diminuir ao máximo a repetição de código dentro de um projeto, sempre existe algum ponto onde isso não é inteiramente possível.

O NHibernate é uma ferramenta ORM (Mapeamento Objeto Relacional), que permite a utilização de um banco de dados relacional em uma aplicação modelada com a orientação a objetos. Para saber mais sobre o NHibernate procure por um das dezenas de artigos sobre o assunto na .NET Magazine. Quem trabalha com NHibernate sabe exatamente onde é difícil aplicar técnicas de reutilização. O ponto onde temos uma grande repetição de código está nos arquivos de mapeamento.

  O NHibernate possui um mecanismo de mapeamento que determina como cada classe de negócio deve ser interpretada e como é sua representação em uma tabela de um banco de dados. Isso permite que uma classe possa ser salva em um banco relacional, e posteriormente ter seus dados recuperados deste mesmo banco de dados.

 Esse mapeamento é nativamente feito através de arquivos XML, que possuem a extensão .hbm.xml (hbm é a sigla de hibernate mapping). Esses arquivos XML servem como um dicionário declarativo, que determina o que cada propriedade de cada classe representa em um banco de dados relacional.

Quando um projeto contém uma grande quantidade de classes de negócio, a quantidade de arquivos de mapeamento é exatamente a mesma. Isso, muitas vezes, pode gerar um problema para a manutenção de uma aplicação.

 O ConfORM surge para lidar exatamente com esse problema. A proposta é que os mapeamentos de um projeto possam ser gerados automaticamente. Essa geração é feita através de uma série de convenções. Uma convenção é uma regra que determina um padrão a ser seguido. Essas regras podem estar pré-estabelecidas no próprio ConfORM, ou terem sido criadas especificamente para o projeto em questão.

Sendo assim, é possível por exemplo, determinar que toda propriedade chamada Descricao, deva ter um tamanho de 100 caracteres, e permitir valores nulos. Isso significa que se o modelo desse projeto possuir 20 propriedades com o nome Descricao, em classes diferentes, todas vão ser mapeadas utilizando essa regra.

E é assim que o ConfORM propõe a reutilização de código no mapeamento do NHibernate. A manutenção é portanto muito mais simples, já que deverá ser feita nas convenções e nunca em arquivos individuais de mapeamento.

 

Como funciona o ConfORM

Como já foi citado, em uma aplicação com NHibernate comum, os mapeamentos são feitos através de arquivos XML.

 O NHibernate irá interpretar cada um dos arquivos de mapeamento XML e desserializá-los em objetos da classe HbmMapping. Em seguida cada um desses objetos HbmMapping são adicionados à configuração do NHibernate. A classe HbmMapping contém informações sobre o mapeamento dos objetos, como para qual coluna irá aquela propriedade, qual propriedade representa a chave primária e assim por diante. A Figura 1 demonstra claramente como esse processo ocorre.

 Com o ConfORM, esse processo de desserialização não ocorre. O mapeamento feito com o ConfORM gera os objetos HbmMapping através das convenções estabelecidas para o projeto, e esses objetos HbmMapping são adicionados diretamente nas configurações do NHibernate, pulando então esse processo que era uma tarefa que custava tempo, desserializar os arquivos de mapeamento XML. Quando existia apenas a forma XML de mapeamento, inicializar o NHibernate poderia causar um certo gargalo nas aplicações. Quando digo inicializar, digo a construção da configuração do NHibernate que é feita na primeira vez em que um objeto é acessado por ele. É justamente nesse momento em que ocorria a leitura e validação dos arquivos XML. Quanto mais um domínio era considerado grande, o tempo dessa leitura era maior. Foram desenvolvidas algumas práticas para contornar esse impacto, mas agora com o ConfORM isso não é mais problema. Nas próximas páginas será demonstrado como utilizar o ConfORM.

 

O exemplo, camada de domínio

Neste exemplo a aplicação foi dividida em camadas. A primeira camada é a camada de Domínio que é totalmente independente do NHibernate, não possuindo nenhuma referência às DLLs do NHibernate ou do ConfORM. É nessa camada que estão definidas as entidades de negócio da aplicação. A Figura 2 ilustra as classes que compõem esse modelo.

 Esse modelo representa uma loja que comercializa produtos do tipo Filme e Livro. Para os Filmes existem informações de autores e personagens que eles representam. As entidades Filme e Livro herdam da entidade Produto, e as entidades Produto e Papel herdam diretamente de uma classe abstrata chamada EntidadeBase (Listagem 1).  

EntidadeBase possui as propriedades Id do tipo long, e Version do tipo int. Isso significa que todas as entidades do domínio vão possuir essas duas propriedades, que por sua vez precisarão ser mapeadas. Com isso esse modelo já está impondo uma política única para os IDs das entidades, que deverá ser refletido no banco de dados que servirá de repositório.

A propriedade Version é um recurso do NHibernate para a implementação de concorrência otimista, que garante que quando duas pessoas estiverem editando o mesmo registro, a primeira a concluir a operação é que terá suas alterações persistidas. A segunda pessoa deverá receber uma mensagem alertando-a da situação.    Além disso, a EntidadeBase sobrecarrega os métodos Equals e GetHashCode, e implementa os métodos IsTransient e GetUnproxiedType. Esses cinco métodos são necessários para que ao verificarmos se duas entidades são iguais, o .NET considere apenas a propriedade ID para essa verificação, no caso de entidades que já foram persistidas e possuem um ID.

 

Listagem 1. EntidadeBase do Domínio

public abstract class EntidadeBase"



ATENÇÃO! A exibição deste artigo foi interrompida.


  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da .net Magazine DIGITAL ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!






    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
Rodrigo Sendin

é Arquiteto de Sistemas e trabalha com desenvolvimento de Software há mais de 13 anos. Tecnólogo formado pela FATEC de Americana e MCP .NET.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03