Un jour où j'avais un peu de temps libre, je me suis dis, "Et si je réinventais la roue ?". Appliqué dans ce cas, je me suis demandé comment pourrais-je faire pour créer une librairie d'accès aux données qui soit complètement objet, et qui permette de s'affranchir au maximum du type de SGBD sous-jacent...
Voici le résultat de mon travail.
Le moteur se compose de plusieurs classes :
- Une classe de base pour les données (sérialisable, avec INotifyPropertyChanged)
- Une classe pour implémenter les fonctions minimales requises pour accéder à un SGBD
- Une classe qui permet de faire les requêtes dans la base (insert, update, delete, select)
- Des classes pour définir ces requêtes
Pour définir une donnée (ou entité), on crée une classe qui hérite de ClsBusinessEntity. Elle possède un attribut BusinessTable pour définir à quel table elle appartient. Chacune de ses propriétés possède un attribut BusinessField pour définir le champ de la table (nom du champ, type de donnée, longueur). Si le champ est une clé primaire, on ajoute l'attribut BusinessKeyField. Si c'est un Guid, on met l'attribut BusinessGUID (le traitement est légèrement différent).
Pour accéder à la base de données, on instancie une classe d'accès aux données, qui implémente ClsBusinessDataLayer<TProvider>, qui elle-même utilise Ado.net pour faire la liaison.
Pour utiliser les données, on doit créer un "moteur" pour y accéder. On instancie un ClsBusinessEngine<TEntity, TLayer> où TEntity est le type de l'entité à gérer et TLayer le type de la couche d'accès aux données (ClsBusinessDataLayer).
Après, tout se fait tout seul (ou presque), un petit exemple est fourni, avec une implémentation pour MySql.