Accédez à vos données avec Dapper

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le vendredi 23 septembre 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Dans ce billet, nous allons parler de Dapper qui est un micro ORM réalisé par le célèbre site StackOverflow, open-source et utilisable en C#.

 

C’est quoi un micro-ORM ?

Au tout début, il y avait ADO.NET avec ses IDbCommand et ses SqlParameter à remplir à la main. Puis il y a eu les datasets typés avec son code généré et ses xsd difficiles à merger. De quoi se prémunir des injections SQL et d’avoir des performances idéales avec un contrôle fort sur le SQL qui était joué. Laborieux, mais fonctionnel.

Puis il y a eu les ORM, façon Entity Framework ou NHibernate avec leurs magies attirantes mais encore et toujours des problèmes. Que ce soit au niveau de la montée en compétence ou du risque de facilement faire n’importe quoi, sans parler du manque de transparence sur ce qui se passe exactement avec des performances souvent mauvaises. Et même si les approches code first ou fluent ont permis de ne plus s’arracher les cheveux avec les merges, on a encore un petit arrière-gout amer…

Et si on avait une solution entre les deux ? Cette solution a un nom : les micro-orm. Un micro-orm a pour idée d’offrir une approche minimaliste pour effectuer un mapping entre un objet et une base de données. En général, on mappera une classe à une ligne de datareader.

Et dans cette catégorie, il y a un micro-orm développé par le célèbre site StackOverflow : Dapper, qui est très intéressant et que nous allons nous empresser de découvrir.

La première chose à faire bien sûr est d’installer Dapper via NuGet :

 

 

à noter qu’il existe également une version asynchrone de la bibliothèque (Dapper.Async).

Dapper fonctionne avec des méthodes d’extension portant sur l’interface IDbConnection ; cela implique que vous ouvriez la connexion préalablement à l’utilisation de Dapper. On le fait classiquement avec un :

 

 

Et c'est un avantage car ainsi, vous serez capable d'utiliser Dapper avec n’importe quel provider ADO.NET comme SqlLite, Oracle, MySql, etc.

 

Insertions en BDD

Pour la démo, je vais créer une table toute bête avec quelques types simples, permettant de stocker des tâches :

 

Pour la première étape, nous allons insérer des données et cela peut se faire facilement avec :

 

 

Bon, pour l’instant, rien de révolutionnaire. Mais on peut aller un peu plus loin en utilisant un mapping objet, avec :

 

sachant que bien sûr la classe Tache est un POCO classique :

 

 

Automatiquement, Dapper va mapper les propriétés de votre objet avec la requête paramétrée. On utilise le @ comme on peut le faire avec des SqlParameters. Mais là, pas besoin de dire que c'est un nvarchar et que la taille est 255 ... plutôt intéressant.

D’ailleurs, pourquoi s’arrêter à un unique objet en paramètre ? On peut bien sûr passer une liste d’objets pour faire de l’insertion en masse :

 

 

Notez que cela fonctionne aussi avec un objet anonyme, à partir du moment où les champs ont les bons noms :

 

 

Sélection des données

Bon, insérer c’est bien, mais il serait peut-être temps de penser à requêter :). Et pour cela, rien de plus simple, on utilise la méthode Query :

 

 

qui renvoi soit une énumération de dynamics, soit une énumération typée si on utilise la version générique de Query :

 

 

Bien sûr, vous pouvez effectuer toutes sortes de filtres dans vos requêtes, du genre :

 

 

Et maintenant, essayez de vous souvenir comment vous faisiez avant, avec vos datareader ? ^^ Plutôt efficace ce dapper !

Et pour des requêtes particulières, par exemple un count ? Il suffit d’utiliser à nouveau Query qui renvoi une liste de dynamic et d’exploiter le premier élément :

 

 

N’oubliez pas d’utiliser un alias dans le SQL pour pouvoir accéder à la propriété du même nom.

Vous pouvez évidemment exécuter des update ou des delete de la même façon que nous avons utilisé l’insert.

 

Utiliser des procédures stockées

Il est également possible d’utiliser des procédures stockées. Créons la procédure stockée suivante :

 

 

Il ne reste plus qu’à l’appeler en lui passant les éventuels paramètres :

 

 

Et comme ici, je renvoi une liste d’éléments de la tâche, je peux bien sûr les mapper directement à une liste de tâches.

 

Utiliser une transaction

Enfin, et je m’arrêterai là pour ce billet, vous pouvez tout à fait utiliser des transactions de la même façon que vous auriez fait avec ADO.NET, il suffit de faire :

 

 

Notez que nous avons besoin cette fois-ci d’ouvrir explicitement la connexion avec Open().

 

Objets mappés ?

Alors vous allez me dire que vous pouvez faire grosso-modo pareil avec un ORM et qu’en plus, avec un ORM, vous avez un modèle objet qui mappe votre base de données et qui est utilisable directement dans vos couches métiers ? Nonon, c’est une erreur. Les POCO des ORM ne doivent surtout pas être utilisés directement par les couches du domaine. Ils doivent être transformés en objet du domaine, car non, ce ne sont pas des objets du domaine !

Et c’est ici la même chose pour Dapper. Ces POCO qui mappent des lignes de la base de données ne doivent pas être des objets métiers. Déjà parce que ce sont des POCO avec des propriétés publiques et ce n’est pas une bonne idée de construire des objets métiers de cette façon et ensuite parce que nous devons isoler la partie d’accès aux données.

 

Conclusion

Voilà pour ce petit tour de Dapper ; ce micro-orm développé par StackOverflow qui vous apportera simplicité, efficacité et performances. N’hésitez pas à lui donner une chance car même aujourd’hui il a encore sa place face aux nouvelles fonctionnalités des ORM. Vous pouvez aller faire un tour sur le github pour voir d’autres exemples https://github.com/StackExchange/dapper-dot-net. Ah oui, et encore un bonus supplémentaire pour Dapper non négligeable, il est compatible .NET Core :).

Commentaires