.NET 5 arrive à grand pas, annoncé pour la fin d’année, plus précisément en novembre. Il apporte son lot de nouveautés. Nous allons en prendre une : Source Generator. Pour mieux la comprendre nous allons la comparer à Roslyn.

Ecosysteme .NET

Pourquoi ce comparatif ? Au premier abord on peut penser que les deux font la même chose, en tout cas, tournent autour de la génération de code. Cet article a pour but d’exposer leurs avantages et inconvénients, ou plutôt quand il faut utiliser l’une plutôt que l’autre. Nous allons nous servir d’un sujet, le mapping d’objets, pour comprendre comment ces deux technologies adressent ce besoin.

Posons les bases

Avant de rentrer dans le vif du sujet, ayons une vue globale de ces 2 technologies dans l’écosystème .NET.

Roslyn, est le projet de réécriture du compilateur de l’écosystème .NET. Avant Roslyn le compilateur était en C++. C’était une boite noire, les développeurs n’avaient pas la main dessus et donc ne pouvaient pas l’étendre selon leurs besoins. Avec Roslyn tout change, une api est exposée qui permet d’obtenir des objets C# décrivant les métadonnées du code source. A partir de ces objets nous avons une vue typée, représentation de la compilation de ceux-ci. Par exemple, nous pouvons savoir si une variable est utilisée dans le corps d’une méthode ; combien de fois, de quel type… On peut aussi remplacer toutes les définitions de variable via “var” par le type concret.

Roslyn API

Source Generator est une nouveauté de .Net 5, la version d’unification de l’écosystème .NET. Entre Core, Framework, Xbox, Windows, Linux la même réponse .NET 5. Plus précisément c’est un élément ajouté à la chaine de compilation existante. Une nouveauté du compilateur, une nouveauté de Roslyn ?

SourceGenerator pipeline

Concrètement, vous allez faire une classe décorée de l’attribut Generator et implémentant l’interface ISourceGenerator. Cette classe va être appelée au moment de la compilation. En entrée vous avez accès à toutes les méta-données des objets compilés. C’est une approche similaire à un diagnostic avec Roslyn. Cette classe produira en sortie du code représentant un fichier cs qui sera ajouté directement à la compilation en cours

Source Generator ne modifie pas le code source existant. Il n’y a pas de modification du code source déjà écrit dans Visual Studio mais bien un ajout de fichier.

Utilisation: Mapping d’objets

Avec Roslyn, vous pouvez proposer des suggestions sur l’écriture du code, mettre le focus sur les bonnes pratiques. Mais ça ne s’arrête pas à de l’information, avec Roslyn vous pouvez également proposer un remaniement du code, une factorisation par exemple. Vous pouvez modifier le code couramment sélectionné dans Visual studio avant la compilation manuelle du projet.

Dans l’exemple du mapping d’objets, pour l’implémentation de classes DTO à partir de classes Model par exemple, vous allez implémenter une extension de Roslyn via :

– une classe héritant de DiagnosticAnalyzer pour spécifier dans quel cas votre code devra être exécuté, et comment il se présentera dans Visual Studio

– puis une autre classe de type CodeFixProvider pour proposer la(es) suggestion(s) de modification du code courant pour ce mapping selon vos besoins.

Cette méthode apporte un gain de temps dans la réalisation du code grâce à de l’outillage industrialisant un type de tâche de développement très fréquent dans la plupart des applications, même si le coût d’écriture et de stabilisation de ces extensions n’est pas trivial de prime abord.

Cependant, la portée étant réduite au code en cours, ne permet donc pas de faire automatiquement un travail de masse sur l’ensemble du code d’une solution.

 

Avec Source Generator, vous pouvez générer ces mappings via l’introspection des objets métiers, sans pénalité d’exécution:

-Auparavant, cette introspection de code serait nécessairement exécutée au runtime (via System.Reflection). Sachant que vos objets métier ne changent pas de structure en cours d’exécution et même s’il y a du cache dans l’API de Réflexion, cette génération est coûteuse en performance. Plus coûteuse que de le faire à la main.

-Avec Source Generator, ce coût sera impactant seulement au moment de la compilation. Un second avantage de cette technologie est d’avoir les fichiers générés intégrés à votre projet comme si vous l’aviez codé vous-même. La détection des problèmes liés au code généré (ici de mapping) sera vite observée et traitée.

On peut prendre quelques instants pour approfondir le sujet du mapping en comparant avec l’utilisation de la bibliothèque AutoMapper. AutoMapper permet de faire du mapping d’objets via le nommage des propriétés ou des règles en dur dans le code pour les cas les plus complexes. Il utilise pour cela l’introspection. Le coût en performance d’une telle technologie comparé aux deux précédentes devient maintenant important par rapport aux bénéfices apportés, le principal étant de ne pas devoir faire manuellement ce code « ennuyeux » de mapping. Certains sont prêts à accepter ce coût élevé d’exécution.

Avec Roslyn, et Source Generator les scénarii d’utilisation sont beaucoup plus larges que l’industrialisation du code de mapping d’objets. Dans le cadre spécifique du mapping, la prise en main d’un AutoMapper est plus intuitive et rapide sur des objets peu complexes que les deux autres.

Mot de la fin

Microsoft améliore constamment son écosystème en termes de performance, de prise en compte des plateformes et dans une autre mesure, de prise en main ou de productivité des développeurs.

Source Generator est une brique intéressante pour rendre l’introspection plus populaires et éviter de faire du code répétitif, tout en gardant une bonne performance d’exécution. Roslyn est une brique plus importante, que Source Generator utilise, pour fournir des informations importantes et ainsi permettre une manipulation poussée du code source.

Ces deux technologies permettent à l’équipe de développement de s’outiller selon les besoins propres du projet avec des éléments inhérents au Framework, .NET, gage de pérennité par rapport à un package tiers.

Références:

Roslyn

https://github.com/dotnet/roslyn/wiki/Roslyn-Overview

https://docs.microsoft.com/fr-fr/visualstudio/extensibility/getting-started-with-roslyn-analyzers?view=vs-2019

Source Generator

https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

AutoMapper:

https://automapper.org/

[/fusion_text][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]