On m’a récemment demandé un avis sur l’architecture d’une application Windows écrite en .NET. Bien que l’exercice soit toujours difficile car cela dépend bien évidemment du contexte, je profite de ce billet pour donner quelques pistes de réflexions quand au choix des briques logicielles. Le demandeur venant du monde Java, mon discours sera orienté dans ce sens.
- Outil de mapping objet relationnel : à mon sens, il y a aujourd’hui 2 alternatives en .NET :
- NHibernate, le cousin germain de Hibernate. Pour éviter la configuration dans les fichiers XML, je conseille le mode fluent ainsi que l’API de requêtage LINQ . Un début de présentation est disponible ici. Sinon, il y a aussi les slides de la formation en soirée qui a été animée l’automne passé.
- Entity Framework. La dernière version reprend des principes de NHibernate, dont notamment la programmation par POCO (Plain Old C# Object), le lazy loading (chargement tardif). Comme je le mentionnais dans ce billet, plusieurs modes sont disponibles : Database first, Model First et maintenant Code First, très proche de Fluent NHibernate. Un atelier en soirée aura lieu fin mai sur ce thème.
- Spring.NET : je trouve la question délicate, car cela dépend vraiment du besoin (IoC, programmation par aspects, boîte à outils, framework MVC …). Comme son cousin Java, c’est une véritable boîte à outils très (trop ?) riche. Cette richesse est parfois synonyme de complexité et de lourdeur, par rapport à d’autres conteneurs IoC tels que NInject, Autofac, StructureMap, Castle Windsor ou Unity. Son principal inconvénient était sa configuration « XML based ». Ce point devrait être adressé avec la sortie de CodeConfig. Sa proximité avec son cousin est souvent un critère de choix pour des équipes mixtes (Java/NET).
- NUnit : très proche de son cousin Java JUnit, il est également basé sur des attributes. Dans le monde ouvert, j’apprécie également MBUnit maintenant inclus dans le framework Gallio. Pour intégrer ces frameworks open-source dans un IDE tel que Visual Studio, je conseille test driven.net. Microsoft fournit également son propre framework, qui ressemble beaucoup à NUnit et qui est très bien intégré dans Visual Studio. J’avoue l’utiliser très souvent. J’aime particulièrement la structuration par projet, qui fonctionne également pour tester des classes « internal ». J’aime également la facilité avec laquelle on peut écrire des tests orientés données, en prenant un fichier CSV pour indiquer les paramètres d’entrée et les paramètres de sortie.
- Un équivalent à Mockito. Ne l’ayant pas utilisé sur un projet, la réponse risque d’être déplacée. Néanmoins, j’utilise parfois moq ou NMock. Je suis preneur d’un comparatif
- Pour la base de données, encore une fois je penche pour la facilité d’intégration et donc pour une solution SQL Server Express, ou SQL Server Compact, selon l’usage. Les deux solutions sont gratuites.
Je termine par un outil que je trouve très utile, qui est maintenant intégré à Visual Studio 2010 SP1 et qui permet de gérer des librairies externes, un maven like light : NuGet.
Je profite de ce billet pour diffuser l’annonce de la sortie de Entity Framework 4.1.
Entre autres choses, cette version inclut le mode « code first » que j’avais présenté ici. De fait, Entity Framework supporte maintenant trois approches :
- Database First : approche initialement utilisée par EF dans laquelle nous travaillons sur un modèle relationnel pour en déduire les modèles conceptuel et objet.
- Model First : approche implémentée dans EF 4 dans laquelle nous travaillons sur un modèle conceptuel. A partir du modèle conceptuel et de templates personnalisables, les modèles objet et relationnel sont générés.
- Code First : on écrit d’abord des bonnes vieilles classes C#, les modèles conceptuel et relationnel sont déduits de classes de mapping, basées sur des expressions Lambdas.
Pour les ingénieurs d’Objet Direct Grenoble, nous aurons l’occasion de revenir sur les fonctionnalités apportées par cette version lors de la présentation technique qui aura lieu fin mai.
Je profite de cette brève pour faire un petit clin d’œil à ce provider LINQ qui permet d’agréger des informations issues du site twitter.
Un exemple de code est disponible ici.
J’ai présenté très rapidement NuGet dernièrement, permettant d’intégrer rapidement des librairies externes. Mais NuGet n’est pas magique : il ne sait pas gérer les conflits d’assembly, et d’une certaine façon, c’est mieux ainsi ! Alors que faire … ?
Prenons un exemple que j’ai rencontré il y a quelques temps : je souhaite utiliser FluentNHibernate en version 1.0, librairie qui a été compilée avec une version de NHibernate 2.1.0.4. Je souhaite également utiliser le dernier build de NHibernate en version 2.1.2.4 que je rajoute comme une librairie de mon projet via Visual Studio. J’obtiens alors pour une même librairie, deux versions différentes : c’est le conflit de version…
Je dois supprimer une des deux librairies. Étant donné que je veux utiliser la version 2.1.2.4, je supprime la référence à la version 2.1.0.4. Lorsque j’exécute mon programme j’obtiens une exception de ce type :
System.IO.FileLoadException: Could not load file or assembly ‘NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4′ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0×80131040)
Pour résoudre ce conflit, je vais indiquer à la CLR qu’il faut utiliser la version 2.1.2.4 au lieu de la version 2.1.0.4. Cette redirection n’ayant de sens que pour mon application, je vais configurer cette redirection au niveau de mon application. Dans la section configuration de mon fichier app.config, je rajoute l’élément suivant:

Cliquer sur l'image pour agrandir
En discutant au café ce matin, j’ai constaté que l’utilitaire NuGet n’était pas suffisamment connu à mon goût. Il faut dire que je le trouve très pratique.
Mais NuGet, c’est quoi ? C’est un utilitaire plutôt bien intégré à Visual Studio qui permet de gérer simplement les librairies externes de votre projet. Un click droit sur votre projet vous permet d’ajouter une « Library Package Reference », dans le même esprit que l’ajout d’une référence de librairie.

Il y a néanmoins 2 différences majeures avec l’ajout d’une référence :
- NuGet est capable d’aller chercher des librairies dans un repository externe.
- Si les packages sont bien écrits, il récupèrera également les dépendances de la librairie, avec les bonnes versions des assemblies. De ce point de vue, c’est comparable à Maven et c’est une très bonne chose.
La CTP5 de Code-First est disponible. La prochaine version annoncée pour mi 2011 sera la version finale.
J’avais présenté très rapidement Entity Framework dans ce billet en introduisant le mode fluent. La CTP5 embarque certaines fonctionnalités très intéressantes.
Je vous conseille notamment de regarder le support des annotations du namespace DataAnnotations. Ces annotations permettent de spécifier les contraintes du domaine directement dans les classes POCO. Ces contraintes seront exploitées par le modèle relationnel, par le modèle objet via Entity Framework et également par les couches d’IHM supportant ces annotations.
L’annonce de Scott Guthrie.
Je n’ai rien trouvé de vraiment transcendant dans cette annonce. Ce sont essentiellement des améliorations ou des évolutions (impressions, support des médias).
Je note toutefois des améliorations sur WCF Ria Services, et notamment la gestion des types complexes. Ceux qui ont déjà travaillé avec WCF Ria Services ont probablement du être confronté à ce problème. J’espère que la solution retenue sera suffisant flexible pour intégrer facilement des briques comme NHibernate.
La sortie est prévue pour mi 2011. L’annonce de Scott Guthrie : http://weblogs.asp.net/scottgu/archive/2010/12/02/announcing-silverlight-5.aspx
Novell a été racheté (partiellement) par Attachmate. Une deuxième transaction a eu lieu avec une holding CPTN. Derrière cette holding, on trouve Microsoft… http://www.programmez.com/actualites.php?id_actu=8563&xtor=EPR-144
Rappelons par ailleurs que c’est Novell qui jusqu’à présent, avec des accords passés avec Microsoft, poussait le projet Mono. On retrouve notamment dans ce projet une implémentation open-source de la CLR, MoonLight une implémentation open-source de Silverlight, et MonoTouch qui permet de développer des applications iPhone en C#.
Quelle sera la suite du projet Mono ?
Le W3C sera présent à l’Université de Lyon afin d’échanger sur les technologies Web (HTML5, CSS3, SVG…) le jeudi 4 novembre 2010 de 19h à 21h au Centre de Congrès de Lyon (Salon Pasteur).
http://www.universite-lyon.fr/l-universite-de-lyon/meetup-w3c-on-thurday-4-november-2010-154464.kjsp?RH=PRINC-FR
Après MonoTouch, un kit de développement pour créer des applications iPhone et iPod Touch en .NET, sorti en version 3.1 au mois de septembre et qui supporte l’iOS 4.1, l’équipe de Novell s’est lancée dans MonoDroid, le pendant de MonoTouch pour Androïd.
La version courante est en « Preview closed », ce sont donc encore des balbutiements. La version 2.0 basée sur des retours utilisateurs sera probablement plus intéressante. A suivre…
Nous aurons probablement l’occasion d’en rediscuter lors des séminaires du mois d’Octobre sur les SmartPhone.
Derniers commentaires