Linq to NHibernate

Sur le champ de bataille des ORM en .NET, NHibernate a fait une percée importante pendant ces vacances estivales avec le support de Linq. L’annonce d’Ayende est ici.

Regardons quelques exemples classiques d’utilisation. Nous partirons du modèle suivant, issu d’un guide sur Fluent NHibernate.

Notre modèle

Filtrer une liste d’entités sur une propriété:

var query = from store in session.Linq<Store>()
where store.Name == « SuperMart »
select store;

Charger une collection mappée avec un chargement tardif (lazy loading):

var query = from store in session.Linq<Store>()
from product in store.Products
where store.Name == « SuperMart »
select store;

Attention toutefois, car cette requête retourne un produit cartésien (n objets store identiques avec une collection chargée, n étant le nombre de produits associés au store) et non un arbre d’objets.

Écrire une requête dynamique filtrée sur une collection:

// la requête initiale

var query = from store in session.Linq<Store>()
from staff in store.Staff
from product in store.Products
select store;

// on rajoute dynamiquement des critères de recherche en rajoutant des contraintes à l’arbre d’expressions

var employee = « Harrison »;
query = query.Where(x => x.Staff.Any(y => y.LastName == employee));

Avantages de cette alternative

  • Les requêtes sont vérifiées à la compilation
  • L’IDE vous propose la complétion et le refactoring
  • Vous pouvez toujours utiliser l’API classique (ce n’est qu’un facilitateur)
  • La syntaxe est proche d’une syntaxe SQL
  • Cerise sur le gâteau : la publication de données avec ADO.NET Data Services va être possible avec NHibernate

Remarque:

  • L’implémentation n’est pas encore complète et peut conduire à des effets de bord inattendus (cf la remarque sur le produit cartésien)

.NET RIA Services

Ceux qui ont assisté à la formation en soirée sur Silverlight ont eu un avant gout de .NET RIA Services. Ce framework risque de grandement améliorer la productivité des développements d’applications RIA en .NET.

Quelles sont les réponses apportées par ce framework aux problèmes classiques d’applications RIA ?

– Je ne veux pas réécrire des classes de mon domaine (suivant le modèle Value Object)
– Je ne veux pas écrire le code technique de synchronisation des données entre les deux tiers pour de simples manipulations de données (CRUD)
– Je veux pas réécrire des classes Helper
– Je ne veux pas réécrire mes règles de validation décrites par annotations sur les classes de mon domaine
– Je ne veux pas réécrire mes requêtes LINQ
– Je veux pouvoir travailler simplement sur du CRUD ou des services
– Je veux pouvoir me baser sur le mécanisme d’authentification/autorisation défini sur le serveur

Je présenterai plus en détails ce framework dans le wiki ou dans un autre post et vous ferai part de mes premiers essais.

La preview est disponible sur le site de Microsoft. Cette version nécessite Silverlight 3 qui est en beta 1.

Tech Days 2009 (suite)

Ayant également eu le plaisir de participer aux Tech Days 2009, je vous présente quelques éléments en complément de ceux apportés par Jean-François :

Sync Services for ADO.NET

Tout d’abord une petite précision sur le vocabulaire employé, car la confusion peut vite gagner. Microsoft Sync Framework (MSF) est la plateforme Microsoft de synchronisation permettant la collaboration et le travail en mode déconnecté pour les applications, services et périphériques. Plusieurs fournisseurs de synchronisation (providers) permettent de manipuler ce framework :

  • Sync Services for ADO.NET : Permet la synchronisation de sources de données ADO.NET
  • Sync Services for File Systems : Permet la synchronisation de systèmes de fichiers et dossiers
  • Sync Services for SSE : Permet la synchronisation d’extensions comme RSS ou encore ATOM

La session à laquelle j’ai participé présentait exclusivement le fournisseur Sync Services for ADO.NET. Nous avons pu voir comment élaborer simplement une application permettant de travailler sur une base client en déconnecté à partir d’un laptop et d’un PDA. Au programme : synchronisation des bases, change tracking et résolution des conflits. Je dois bien avouer que l’API et les assistants de Visual Studio permettent d’effectuer toutes ces tâches très simplement !

Pour clore cette session, nous avons même eu droit à une démonstration de la même solution sur un PDA en Java, renforçant ainsi la volonté affichée de Microsoft en matière d’interopérabilité.

WPF et Silverlight 2

Nouveaux fleurons de Microsoft pour le développement d’interfaces utilisateurs riches, les technologies Windows Presentation Foundation (WPF) et Silverlight 2 ont eu, comme nous pouvions nous y attendre, la part belle au cours de ces trois jours.

Comme le disait Jean-François et malgré le discours officiel il semble bien que Microsoft souhaite voir WPF succéder aux Winforms. Aussi, la plupart  des démonstrations mettant en jeu une interface graphique ont été réalisées en WPF.

Côté mise eu œuvre, plusieurs sessions traitaient des bonnes pratiques pour la réalisation d’un projet avec ces technologies. De ce côté-là, rien de bien nouveau. Les préconisations sont d’utiliser des design patterns d’interface utilisateur tels que M-V-C, M-V-P et, celui qui est à priori le plus approprié : M-V-VM (Model-View-ViewModel). Ces modèles permettent entre autre de faciliter ce qui constitue la deuxième préconisation : faire des tests !

Donc vous l’aurez compris, l’objectif était surtout de convaincre les frileux et les indécis de franchir le cap du XAML.

C# et LINQ avancé (Geek inside)

Pour terminer, une session que j’ai particulièrement appréciée sur la programmation avancée avec C# et LINQ. Elle était animée par Mitsuru Furuta, une référence dans le monde Microsoft. Au programme : LINQ, generics, inférence de type et expression lambda. L’objectif était de mettre en œuvre efficacement ces concepts au travers de trois exemples utiles. Pour plus d’information, je vous renvoie à son blog où vous pourrez consulter deux de ces exemples :