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