terça-feira, 29 de abril de 2008

Desenvolvimento de Aplicações Web Utilizando Castle ActiveRecord

Olá! Neste post pretendo apresentar o framework de persistência de dados Castle ActiveRecord, com o qual tenho desenvolvido algumas aplicações nos úlimos meses.
Com ele, o desenvolvimento de software pode se tornar muito mais simples e rápido, diminuindo a quantidade de código que o desenvolvedor tem que produzir e facilitando o mapeamento entre o mundo relacional da maioria dos SGBDs comerciais de hoje para o mundo dos objetos, das nossas aplicações .Net. Porém, a desvantagem fica por conta da menor flexibilidade para manipular os dados através dele.

Quem já conhece ou utiliza o nhibernate, o Castle ActiveRecord pode ajudar facilitando a configuração do nhibernate. Com o ActiveRecord não há necessidade de configurar xml para criar os mapeamentos do nhibernate!

A primeira diferença entre desenvolver uma aplicação sem utilizar nenhum framework de persistência de dados e desenvolver uma aplicação utilizando o Castle ActiveRecord é a arquitetura das camadas do software, numa aplicação comum, teríamos as seguintes camadas:
  • Camada de Apresentação (Páginas ASP.Net, por exemplo, é o que o usuário vê)
  • Camada de Controle (As classes que controlam a Apresentação, como o code-behind das páginas ASP.Net e fazem com que aquilo que o usuário vê realize operações)
  • Camada de Negócio (Com os procedimentos do negócio, contém as operações seguindo as regras estipuladas nos requisitos)
  • Camada de Transferência de Dados (também conhecida como Value Objects, é onde temos os principais objetos do sistema)
  • Camada de Acesso à Dados (nela, os dados gerados na aplicação são enviados ao SGBD, e os dados deste são recuperados para serem utilizados na aplicação - geralmente aqui acontece a transformação da forma relacional para a forma dos objetos)
  • Camada de Dados (normalmente dentro do SGBD, programada com Stored Procedures)
Em projetos simples, podemos encontrar uma simplificação da arquitetura acima que dispensa a camada de negócio, que ficaria assim:
  • Camada de Apresentação
  • Camada de Controle
  • Camada de Transferência de Dados
  • Camada de Acesso a Dados
  • Camada de Dados
Já em projetos utilizando o Castle ActiveRecord, teríamos a seguinte arquitetura:
  • Camada de Apresentação
  • Camada de Controle
  • Camada de Modelo (esta nova camada fará o trabalho das 3 últimas camadas do último exemplo, com o mínimo de programação)
Esta arquitetura é conhecida como MVC (Model-View-Control) ou Modelo-Visualização-Controle. De início já notamos que temos duas camadas a menos, só isso já poupa um bocado de desenvolvimento.

Dentro da camada de Modelo, que é onde ficará o código que utilizará o Castle ActiveRecord, acontecerá o seguinte:
As classes serão feitas da mesma forma como eram feitas na Camada de Transferência de Dados, porém todas as classes deverão herdar a classe ActiveRecordBase, que se encontra no framework. A classe deverá, também, ser configurada através de um parâmetro, indicando qual tabela do SGBD aquela classe representa.
As propriedades das classes deverão ser configuradas indicando a qual atributo da tabela elas se referem e se ela é chave primária, um relacionamento com outra tabela, etc.

Exemplo simples de classe em VB (.Net Framework 2.0):

Para a seguinte tabela:

Create Table tbFuncionario(
ID Int,
Nome VarChar(100),
Matricula Char(6))

Teríamos a seguinte classe:


Imports Castle.ActiveRecord

<Activerecord("tbFuncionario")> _
Public Class Funcionario
Inherits ActiveRecordBase(Of Funcionario)

Private _ID As Integer
Private _Nome As String
Private _Matricula As String

<PrimaryKey("ID")> _
Public Property ID As Integer
Get
Return _ID
End Get
Set (ByVal Value As Integer)
_ID = Value
End Set
End Property

<Property("Nome")> _
Public Property Nome As String
Get
Return _Nome
End Get
Set (ByVal Value As String)
_Nome = Value
End Set
End Property

<Property("Matricula")> _
Public Property Matricula As String
Get
Return _Matricula
End Get
Set (ByVal Value As String)
_Matricula= Value
End Set
End Property
End Class


Pronto! Com a classe acima já é possível fazer Select, Insert, Update e Delete na tabela tbFuncionario!

Como?

O Castle ActiveRecord (através do nhibernate) gerará os códigos SQL em runtime para fazer as operações no SGBD. A segunda grande vantagem disso (a primeira vantagem foi a economia de código) é que apenas mudando um parâmetro na configuração do nhibernate, a aplicação poderá utilizar SQL Server, Oracle, ou qualquer outro SGBD suportado pelo nhibernate.

Veja mais informações sobre o Castle ActiveRecord e outros framewors do projeto Castle em:
http://www.castleproject.org/

Veja mais informações sobre o nhibernate em:
http://www.nhibernate.org/

2 comentários:

Augusto disse...

Henrique,

Na minha época, a tentativa de utilizar "ferramentas" (naquele tempo não conheciamos o termo framework) como o Castle (apesar de eu gostar bastante do Hamilton) acabavam dando "M".

Quando chegava a hora de fazer uma transação complexa, só coding na unha mesmo!

O que vc pensa sobre esta parte (a de transações complexas)? Indica um framework assim mesmo?

[]s Augusto Camargo

Henrique Avila disse...

Augusto,

Pela experiência adquirida nos últimos meses eu indico utilizar frameworks como o Castle ActiveRecord em aplicações de complexidade baixa ou até média.

Como o Castle utiliza o nhibernate para persistir os dados, quando nos deparamos com tarefas um pouco mais complexas no SGBD, podemos utilizar uma linguagem chamada HQL (que é parecida com o SQL, porém é independente do SGBD para o qual se está programando).

Na minha opinião, é melhor depender pouco (aplicações de média complexidade) ou nada (aplicações de baixa complexidade) do HQL pois ele torna o desenvolvimento mais demorado devido a sua dificuldade de teste e debug. Muitas vezes desenvolver uma Query HQL complexa é mais demorado do que desenvolver todas as camadas de dados e acesso à dados.

Uma boa alternativa para agilizar o desenvolvimento e que tem um suporte melhor à tarefas complexas é o Linq da Microsoft, lançado recentemente e que integra o .Net Framework 3.5, em breve postarei algumas opiniões sobre ele.

Abrassss!