Utilizando atributos (Attributes) para criar framework objeto relacional em Delphi 2010 – Parte 1

Delphi iconDe todas as novidades trazidas pelo Delphi 2010, sem dúvida o suporte a atributo (Attributes) é uma das que mais gosto. Para aqueles que já conhecem este recursos em outras linguagens como C# e Java, sabem que Attributes traz um mundo de possibilidades e associado com as novas funcionalidades da RTTI faz o casamento perfeito.

Em resumo atributos nos permite definir características para classes e seus respectivos elementos, existem vários exemplos que mostram a utilidade dos atributos. O melhor exemplo onde podemos utilizar atributos é a criação de framework objeto relacional (O/R Mapping), assim sendo começo hoje uma série de post explicando atributos e utilizando OR/Mapping como exemplo, além disso vamos ver dbExpress Framework que será parte da solução.

Atributos obrigatoriamente são definidos através de classes, estas devem herdar de TCustomAttribute a classe base para criação dos mesmos. Abaixo a classe TableAttribute que será utilizada para mapear as classes da aplicação com o banco de dados, a propriedade TableName define o nome da tabela.

TableAttribute = class(TCustomAttribute)
private
  FTableName: string;

public
  { TRttiType can be used as a parameter type; TypeInfo() supplies the argument. }
  property TableName: string read FTableName;
  constructor Create(ATableName: string); overload;
end;

implementation

constructor TableAttribute.Create(ATableName: string);
begin
  FTableName := ATableName;
end;

Definido o atributo para mapeamento das tabelas, basta agora você utilizá-lo nas suas classes, abaixo um exemplo onde a classe TCliente está mapeando a tabela CLIENTE.

[TableAttribute('CLIENTE')]
TCliente = class
public
  { public declarations }
  property Nome : String read FNome write FNome;
  property Endereco : String read FEndereco write FEndereco;
end;

Esse foi o primeiro post, no próximo vamos criar atributos para mapear propriedades com os campos das tabelas.

18 respostas
  1. Everson Clei
    Everson Clei says:

    Andreano…
    Excelente novidade que você esta trazendo em primeira mão para nós, onde este novo suporte que o D2010 traz irá facilitar a vida de muita gente…
    Parabéns… e aguardamos os próximos posts sobre o assunto.
    [],s

    Responder
  2. Ricardo
    Ricardo says:

    Andreano, bacana esse topico.. estou querendo implementar um mini framework para persistencia de dados e acho que isso pode me ajudar… no aguardo da continuação desse post..
    abraço !

    Responder
  3. Alex Luiz Jorge
    Alex Luiz Jorge says:

    Andreano, boa tarde!
    Eu estou tentando desenvolver um Framework e o seu post é bem o que eu preciso. Você tem o resto do código desse post?

    Abraços

    Responder
    • Andreano Lanusse
      Andreano Lanusse says:

      Oi Alex,

      Ainda não, estou na pendência de escrever a Parte 2, mas você pode ver outros post sobre RTTI porque é o caminho que vou usar, além disso já existe outros frameworks no mercado pra você olhar também. A Aquasoft acabou de disponibilizar um vai no site dele aquasoft.com

      Responder
  4. Samuel Deschamps
    Samuel Deschamps says:

    Olá Andreano,
    Apenas uma correção para o seu post:

    – Como você definiu o nome da classe como sendo TableAttribute, ao utilizá-lo na entidade TCliente, deve ser usado como TableAttribute e não Table.
    Ficaria assim:

    [TableAttribute(‘CLIENTE’)]
    TCliente = class
    public
    property Nome : String read FNome write FNome;
    property Endereco : String read FEndereco write FEndereco;
    end;

    Eu desenvolvi um framework de mapeamento objeto relacional que faz uso deste recurso e da nova API do RTTI. Mais informações no meu blog.

    Abraço!

    Responder
    • Andreano Lanusse
      Andreano Lanusse says:

      Oi Samuel, já está corrigido, obrigado.

      Legal sobre o framework, agora é só começar a usar o que você nas suas aplicações 🙂 e se quiser compartilhar com a comunidades se for do interesse.

      Responder

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.