Pour ceux qui connaissent le projet open-source .Net Castle, ActiveRecord va faire pour sa prochaine version une amélioration intéressante concernant la gestion des objets "transients".
Pour rappel, Castle comprend plusieurs projets, dont :
• un container IoC (Inversion of Control) , MicroKernel
• un container plus élaboré qui repose sur le précédent et y ajoute des fonctions de configuration et d'interception
• un framework MVC pour le Web, MonoRail (qui n'a rien à voir avec Mono)
• un framework de programmation orienté aspect, Aspect#
• un framework de persistance, ActiveRecord.
Castle ActiveRecord est une surcouche à NHibernate dont la particularité est de permettre la description du mapping entre classes et database et entre classes directement dans le code sous forme d'attributs.
Une des limitations d'ActiveRecord était de ne pas exposer de moyen de faire des Update sur des objets détachés de la session NHibernate courante, c.-à-d. sur des objets créés hors contexte NHibernate et doté d'un clé primaire valide.
Or ce scenario est commun quand on utilise la classe ObjectDataSource pour le databinding de l'UI : en cas d'update lors d'un postback, le framework .Net crée "dans notre dos", par reflection, une instance de la classe de la source de données, lui assigne toutes ses propriétés (éventuellement modifiées par l'utilisateur via l'UI) et la passe en paramètre de la fonction d'update spécifiée dans la déclaration de l'ObjectDataSource.
On se retrouve donc face à la session nhibernate avec un objet inconnu de la session, peut-être même copie d'un objet présent en session. Appeler Update() sur cet objet lance une exception. NHibernate sait gérer ce cas grâce à la méthode SaveOrUpdateCopy de l'interface ISession (remplacé par merge en v3), pas ActiveRecord qui ne donnait pas d'accès à cette méthode.
Et bien dans la prochaine release de Castle ActiveRecord, l'équivalent fonctionnel de SaveOrUpdateCopy est disponible via la méthode SaveCopy de ActiveRecordBase. Pour l'instant disponible seulement depuis le repository Subversion de castle ou depuis leur serveur de build.
[ActiveRecord or not ActiveRecord ? This is another question…]
Les commentaires récents