Le prototype du jour est une petit bibliothèque permettant d'automatiser la récupération des propriétés d'un objet depuis une ligne d'un DataReader. En un mot, il automatise vos codes qui ressemblent à ça :

public void GetDataFromRow(Utilisateur obj, IDataReader dr)
{
  obj.Nom = (string)dr["nom_utilisateur"];
  obj.Prenom = (string)dr["prenom_utilisateur"];
  obj.Id = (int)dr["id_utilisateur"];
}

Qui s'écrit alors :

AutoDal.GetDataFromRow(obj, dr);

Evidemment, la bibliothèque ne devine pas les noms de vos colonnes, ni les types de données. Un attribut doit être ajouté sur les propriétés de vos objets : Exemple :

private string m_Nom;
[DbColumn("nom_utilisateur", DbType = DbType.String)]
public string Nom
{
  get { return m_Nom; }
  set { m_Nom = value; }
}

Une notion de "segment" est également présente, elle permet de définir les champs à récupérer dans votre objet. Chaque champ appartient à un segment (par exemple : ID, informations générales, informations détaillées). Vous spécifiez dans le GetDataFromRow les segments à récupérer. Certains diront que ca n'est pas "object oriented", qu'un objet ne peut s'envisager que totalement défini, etc. A quoi je répondrai que je m'en fiche, ca n'est pas le propos de mon proto.

En interne, le mécanisme se base évidemment sur de l'introspection (reflection), mais repose également sur la génération de code MSIL (Reflection.Emit). En fait, lors du premier appel d'un LoadFromRow pour un objet (et pour un segment donné), l'objet est inspecté, et le code MSIL de récupération des données depuis la datarow est généré. Lors des appels suivants, ce code sera immédiatement utilisé. Au final, les performances seront du même ordre que si vous aviez tout fait "à la main", et non pas équivalentes à celles obtenues en pure introspection (dans ce cas, les performances seraient catastrophiques).

Le code supporte également les types Nullable (par exemple int? ou DateTime?). La spécification du type de données de la colonne est optionnelle mais permet d'optimiser l'accès aux données (sinon, le moteur doit inspecter le type de la donnée pour la convertir dans le même type que la propriété de l'objet).

Le code source contient une petite utilisation minimaliste reposant sur une base de données SQLite. A priori, cela devrait également fonctionnner avec les autres bases (en particluier SQL server ou MySql).

Après un certain nombre d'essais, je n'ai toujours pas trouvé de façon élégante d'automatiser les autres parties de la couche DAL : la création / récupération des requêtes SQL et le passage des paramètres. J'ai fait un certain nombre de protos non probants, mais je ne désespère pas de faire quelque chose d'intéressant à un moment ou un autre.

Télécharger AutoDal rev 6