vendredi 10 octobre 2008

ActiveRecord : Premières lignes de code

La théorie

ActiveRecord

ActiveRecord est une design patternqui permet de masquer la complexité des interactions avec la base de donnée en évitant d'écrire du code SQL.

ActiveRecord dans le projet Castle

L'implémentation d'ActiveRecord dans le projet Castle est basée sur la technologie Microsoft.Net et le framework d'ORM (Object Relationnal Mapping) NHibernate.

La subtilité et la simplicité de cette technologie est qu'elle est basée sur la décoration du code par des attributs.

Entités, modèles

Officiellement, dixit la documentation du projet Castle, une classe décorée par des attributs ActiveRecord est appelée un Model, mais cette appellation est trop ambigüe à mon goût et peut prêter à confusion. On préfèrera parler d'Entité.

Toutes nos petites entités doivent donc être rassemblées dans une même couche.

Cette couche est à présent tout en bas de mon modèle multi-couche.

Mais si, souvenez-vous de mon post précédentHé bien avec ActiveRecord, c'est une nouvelle architecture qui se met en place où la couche basse d'accès au donnée n'existe pas, remplacée par une couche d'entités décrivant la structure de la base et les opérations CRUD de base qu'on pourra faire dessus.

CRUDdésignant les 4 opérations standard, en base de donnée relationnelle, sur les entrées d'une table :

  • C - (Create) Création d'une entrée
  • R - (Read) Lecture / sélection d'une entrée
  • U - (Update) Mise à jour
  • D - (Delete) Suppression d'une entrée

Exemple d'entité

Extrait des samples du projet Castle :

using Castle.ActiveRecord;

[ActiveRecord]
public class Entity : ActiveRecordBase
{
private int id;
private string name;

[PrimaryKey]
public int Id
{
get { return id; }
set { id = value; }
}
[Property]
public String Name
{
get { return name; }
set { name = value; }
}
}

L'attribut PrimaryKeyde la table. De très nombreuses options permettent de gérer les différentes spécificités dont on pourrait avoir besoin.

L'attribut PropertySon type sera automatiquement déterminé en fonction du type de donnée côté C#. De très nombreuses options sont disponibles pour personnaliser cette colonne.

Deux méthodes de codage

Explication

Lorsque l'on souhaite développer avec ActiveRecord, deux options s'offrent à vous :

  • Faire hériter chacune de vos entité de ActiveRecordBase
  • Ne pas faire cet héritage, mais utiliser ActiveRecordMediator

de base sont disponibles d'emblée mais peut potentiellement exposer des mécanismes délicats aux développeurs

mais permet d'éviter que des fonctionnalités délicates ne soient exposées par vos API

ouverts. Masquer les fonctionnalités CRUD me permettra de choisir ce que j'expose ou pas dans l'API.

ActiveRecordBase

Ou "je veux que mes développeurs puissent tout faire". Le code de l'entité

using Castle.ActiveRecord;

[ActiveRecord]
public class Entity : ActiveRecordBase
{
private int id;
private string name;

[PrimaryKey]
public int Id
{
get { return id; }
set { id = value; }
}
[Property]
public String Name
{
get { return name; }
set { name = value; }
}
}

Utilisation de cette entité :

// création en base
Entity monEntite = new Entity();
monEntite.Name = "joe";
monEntite.Save();
int id = monEntite.ID;

// chargement depuis la base
Entity monEntite = Entity.Find(id);
string nom = monEntite.Name;

ActiveRecordMediator

Ou "je veux choisir ce que j'expose dans mes entités". Le code de l'entité (c'est le même à l'exception de l'héritage)

using Castle.ActiveRecord;

[ActiveRecord]
public class Entity
{
private int id;
private string name;

[PrimaryKey]
public int Id
{
get { return id; }
set { id = value; }
}
[Property]
public String Name
{
get { return name; }
set { name = value; }
}
}

Utilisation de cette entité :

// création en base
Entity monEntite = new Entity();
monEntite.Name = "joe";
ActiveRecordMediator.Save(monEntite);
int id = monEntite.ID;

// chargement depuis la base
Entity monEntite = ActiveRecordMediator.FindByPrimaryKey(3);
string nom = monEntite.Name;

et notamment à la généralisation de certains développements grâce à la programmation orientée objet...

Aucun commentaire:

Enregistrer un commentaire