ASP.NET Core, MartenDB, et l’Event Sourcing

25 janvier 2024

Dans le monde du développement logiciel, choisir les bons outils et architectures est crucial pour le succès d’un projet.
ASP.NET Core est une plateforme de développement web populaire et performante, tandis que MartenDB offre une intégration de base de données flexible et efficace.
L’Event Sourcing, une méthode de gestion d’état pour les systèmes, devient rapidement un modèle de conception incontournable pour de nombreuses applications modernes.

Pourquoi ASP.NET Core et MartenDB pour l’Event Sourcing?

ASP.NET Core est réputé pour sa légèreté, sa performance et sa facilité d’utilisation. Il se marie parfaitement avec MartenDB, un magasin de documents et un système d’événements pour .NET, qui utilise PostgreSQL. Ensemble, ils fournissent une fondation solide pour l’event sourcing, permettant une gestion des événements cohérente et performante.

Guide Étape par Étape pour Créer Votre Application

  1. Initialisation du Projet et Configuration de l’Environnement
    • Créez un nouveau projet ASP.NET Core.
    • Installez le package NuGet de MartenDB.
    • Configurez votre base de données PostgreSQL.
  2. Définition des Modèles d’Événements
    • Créez des classes C# pour chaque type d’événement. Ces classes doivent inclure toutes les données pertinentes pour l’événement.
    • Identifiez les différents événements qui se produiront dans votre application. Par exemple, UserRegistered, UserNameChanged, etc.
  3. Stockage des Événements
    • Utilisez MartenDB pour enregistrer les événements dans votre base de données chaque fois qu’une action pertinente se produit dans votre application.
      Ci-dessous les exemples de code pour la création d’un utilisateur et sa mise à jour :
      • Création de l’utilisateur

        L’événement est instancié dans le constructeur de « User« 

      • Mise à jour de l’utilisateur

        L’évènement est instancié dans la méthode ChangeName
  4. Projection et Interrogation des Événements
    • Créez des projections pour générer des vues en lecture des événements stockés.
      La projection contiendra les données brut des évènements. Cette vue sera alors une projection de la dernière version de l’agrégat.
    • Utilisez les fonctionnalités de requête de MartenDB pour interroger ces projections.
  5. Optimisation et Surveillance
    • Surveillez les performances de votre application, en particulier la façon dont elle gère et interroge les événements.
      Marten dispose d’une fonction d’écoute et même d’interception des événements de persistance de documents avec l’ IDocumentSessionListenerinterface :
    • Optimisez les requêtes et les index dans la base de données pour améliorer les performances.
      L’application d’index sur les projections participent activement à l’amélioration des performances.
      Ci-dessous la projection user sans index

      Nous y trouvons les champs techniques spécifiques à Marten, dont le champ data qui contient la dernière version de notre aggrégat.
      Pour faciliter la toutes les opérations de recherche ou de trie, je recommande d’appliquer des index.

      Ainsi marten procédera à la mise à jour de notre table en ajoutant les colonnes que nous avons souhaité indexer

Conclusion: Avantages de cette Approche

L’utilisation d’ASP.NET Core avec MartenDB pour l’event sourcing offre plusieurs avantages. Elle garantit une séparation claire entre la logique métier et la gestion de l’état, ce qui rend votre application plus facile à maintenir et à évoluer.
Cette approche favorise une meilleure traçabilité et « auditabilité », car tous les changements d’état sont enregistrés sous forme d’événements.
Enfin, elle offre une flexibilité accrue dans la gestion des requêtes complexes et les scénarios de restauration d’état.

Notons que cette approche n’apporte pas que des avantages, il y a des inconvénient qu’il est important de ne pas ignorer, comme :

  • Le concept peut s’avérer complexe pour les développeurs
  • La montée en compétence peut être longue et complexe, cela provoque un ralentissement du rythme de développement à court terme.
  • Ce temps est à provisionner pour chaque nouveau développeur qui rejoint l’équipe
  • Le stockage de données peut être couteux à long terme
  • En intégrant ASP.NET Core avec MartenDB pour vos projets d’event sourcing, vous bénéficiez d’une plateforme robuste, performante et flexible, adaptée à une grande variété d’applications.

    Code source disponible sur Github : https://github.com/xraboteu/EventStoreWithMartenDb