Fluent NHibernate
Je suis en train de travailler sur une application utilisant NHibernate, et cela me permet d’utiliser la librairie Fluent NHibernate. Cette dernière qui a reçu beaucoup d’attention cer derniers mois (voir le volume de questions sur Stackoverflow) se propose de simplifier la configuration du mapping avec une API se basant sur le principe de l’interface “fluent” (i.e. lisible) par le biais du chaînage des méthodes. Voici un exemple de configuraton classique NHIbernate sous la forme XML :
Voici le même mapping avec Fluent NHibernate :
public class ContactPointMapping : ClassMap { public ContactPointMapping() { Id(x => x.Id);
References(x => x.Contact).WithColumns("ContactId");
References(x => x.Location).WithColumns("LookupLocationId");
References(x => x.Rank).WithColumns("LookupRankId");
JoinedSubClass("Id", EmailAsJoinedSubClass());
JoinedSubClass("Id",PhoneAsJoinedSubClass());
JoinedSubClass("Id", AddressAsJoinedSubClass());
JoinedSubClass("Id", WebSiteAsJoinedSubClass());
}
public static Action<joinedSubClassPart
> AddressAsJoinedSubClass() { return sub => { sub.References(x => x.Usage).WithColumns(“LookupUsagekId”); sub.Map(x => x.PostalCode); sub.Map(x => x.City); sub.References(x => x.Region).ColumnName(“RegionId”); sub.References(x => x.Country).ColumnName(“CountryId”); };
}
}
Il y a quelques temps un projet associé de NH proposait d’exprimer la même chose via des attributes C#. Cela permettait d’avoir un mapping plus proche i.e. de ne pas avoir à ouvrir un fichier externe tout en offrant un typage fort plus sûr que la forme textuelle du XML. Cetains reprochaient à cette approche l’intrusion, même minimale, de NH dans les objets du domaine.
Je trouve en Fluent Nhibernate une bonne alternative. Le mapping est proche (dans le code sans être dans le domaine), avec un typage fort grâce aux expressions lambda. Il reste quelques limitations mais son utilisation est assez intuitive et très productive.
Billet publié dans les rubriques Programmation le