Créer une application .NET complète avec Lino : guide étape par étape

Cette rubrique fournit un guide pratique, รฉtape par รฉtape, pour utiliser Lino CLI comme outil principal dans la construction d'un projetย : depuis l'installation et la configuration initiale, en passant par la gรฉnรฉration de services, de modules et d'entitรฉs, jusqu'aux fonctionnalitรฉs avancรฉes telles que les รฉvรฉnements, les Background Jobs, les migrations, la crรฉation d'images Docker et le versioning.

L'objectif est de montrer, de maniรจre intรฉgrรฉe, comment les Commands CLI s'intรจgrent dans le flux de dรฉveloppement rรฉel โ€” pas seulement les lister, mais expliquer pourquoi chaque choix est fait, ce qui est gรฉnรฉrรฉ automatiquement et quelles sont les implications architecturales.

Mรชme si chaque commande dispose dรฉjร  d'une documentation spรฉcifique, vous verrez ici le processus de bout en bout โ€” une feuille de route reproductible qui รฉvite des heures de travail rรฉpรฉtitif et permet de maintenir un code cohรฉrent et testable.

Tout au long du guide, nous expliquerons les concepts techniques appliquรฉs par Lino (par exempleย : CQRS, TypedResults, Source Generators, Outbox Pattern), nous montrerons des exemples de Commands et indiquerons les bonnes pratiques pour le versioning, le dรฉploiement et l'intรฉgration continue.

Utilisez cette feuille de route comme sรฉquence d'apprentissageย : comprenez d'abord la structure, puis modรฉlisez le domaine, puis gรฉnรฉrez ensuite des API, des pages, des รฉvรฉnements et des artefacts de dรฉploiement. Cela rรฉduit les retouches et maintient le code gรฉnรฉrรฉ alignรฉ sur la conception du systรจme.

Installation et configuration de Lino CLI

La premiรจre รฉtape pour commencer ร  travailler avec le Lino CLI consiste ร  installer lโ€™outil dans votre environnement de dรฉveloppement. Il est distribuรฉ sous forme de outil mondial dotnet, ce qui signifie qu'il sera disponible pour n'importe quel projet.NET sur votre ordinateur. Avant l'installation, confirmez que le SDK.NET requis par les modรจles actuels est disponible et que le terminal peut s'exรฉcuter dotnet et que le rรฉpertoire global des outils.NET se trouve dans le PATH.

ร‰tape 1ย : Installation

Pour installer (ou mettre ร  jour) Lino CLI, exรฉcutez la commande suivante dans le terminalย :

dotnet tool install --global Tolitech.Lino

Remarques importantesย :

  • Si une version est dรฉjร  installรฉe, vous pouvez utiliser dotnet tool update --global Tolitech.Lino ร  mettre ร  jour.
  • Vรฉrifiez que le rรฉpertoire des outils globaux.NET se trouve dans le PATH du systรจme afin que la commande lino fonctionner correctement.

ร‰tape 2ย :ย Configurer la langue

Aprรจs l'installation, il est recommandรฉ de configurer la langue (ou la culture) que CLI utilisera dans les messages, les invites et les journauxย :

lino preferences culture set

Il vous sera demandรฉ de choisir parmi les langues disponibles. Ce paramรจtre garantit que toutes les instructions et invites apparaissent de maniรจre cohรฉrente dans la langue souhaitรฉe. Cette prรฉfรฉrence modifie les messages, invites et conseils localisรฉs de CLIย ; il ne renomme pas les entitรฉs, services, modules ou termes mรฉtier gรฉnรฉrรฉs dans le projet.

ร‰tape 3: Authentification et enregistrement

Pour accรฉder ร  toutes les fonctionnalitรฉs de Lino, y compris les modรจles avancรฉs, la publication d'images Docker et les intรฉgrations avec des services externes, vous devez รชtre authentifiรฉ.

- Si vous n'รชtes pas encore inscrit, inscrivez-vous avec la commandeย :

lino user register

- Si vous รชtes dรฉjร  inscrit, connectez-vous avec:

lino auth login

Ce qui se produit: CLI stocke localement un jeton d'authentification, vous permettant d'exรฉcuter des Commands nรฉcessitant un accรจs ร  des ressources protรฉgรฉes sans avoir ร  vous connecter ร  chaque fois que vous l'utilisez. Gardez ce jeton privรฉ et รฉvitez de partager le mรชme profil utilisateur entre diffรฉrents dรฉveloppeurs, agents CI ou machines.

ร‰tape 4ย : Vรฉrification

Pour confirmer que l'installation et l'authentification ont rรฉussi, exรฉcutezย :

lino --version

Si la commande renvoie la version installรฉe, vous รชtes prรชt ร  commencer ร  utiliser le Lino CLI dans vos projets.

Crรฉation du projet MyApp

Dans cette รฉtape, nous crรฉerons la structure initiale du projet en utilisant le Lino CLI. Ce projet servira de base pour dรฉmontrer la crรฉation de services, de modules, le front-end et l'intรฉgration de tous les รฉvรฉnements. Un projet Lino n'est pas seulement un dossier avec une solutionย : il dรฉfinit les conventions pour les limites des services, les bibliothรจques partagรฉes, l'hรดte Aspire, le framework frontend, les tests, la gestion des packages, les analyseurs et les configurations que les Commands suivantes rรฉutilisent.

ร‰tape 1ย : Exรฉcuter la commande de crรฉation

Pour crรฉer un nouveau projet, exรฉcutez la commande ci-dessous dans le terminalย :

lino project new

CLI vous guidera รฉtape par รฉtape, en vous demandant des informations telles queย :

  • Nom du projetย : nous utiliserons MyApp, mais vous pouvez choisir le nom de votre choixย ;
  • Fonctionnalitรฉs supplรฉmentairesย : analyseurs de code, mise en cache distribuรฉe, prise en charge des รฉvรฉnements asynchrones, etc.

ร‰tape 2ย : configuration des fonctionnalitรฉs essentielles

Pour ce projet, nous vous recommandons d'activer les fonctionnalitรฉs suivantes dรจs le dรฉbutย :

  • Analyseurs de codeย : garantir que le code suit de bonnes pratiques et des normes cohรฉrentes, รฉvitant ainsi les erreurs de mise en ล“uvre courantesย ;
  • Cache distribuรฉย : amรฉliore les performances des applications dans des scรฉnarios avec plusieurs services, en รฉvitant les Queries de base de donnรฉes inutilesย ;
  • Communication asynchroneย : permet l'utilisation d'รฉvรฉnements et de files d'attente pour l'intรฉgration entre les services, garantissant ainsi l'รฉvolutivitรฉ et le dรฉcouplage.

Il est important d'activer toutes ces options dans ce projet, car nous crรฉerons plusieurs services qui communiqueront via des รฉvรฉnements d'intรฉgration. Cela vous permettra de comprendre comment structurer des systรจmes modulaires et distribuรฉs ร  l'aide de Lino.

ร‰tape 3ย : Structure gรฉnรฉrรฉe

Aprรจs avoir exรฉcutรฉ la commande et configurรฉ les ressources, CLI gรฉnรฉrera la structure initiale du projet. Il comprendra:

  • Dossiers de services et de modulesย ;
  • Modรจles frontaux (le cas รฉchรฉant)ย ;
  • Paramรจtres de cache initiaux, รฉvรฉnements et intรฉgrationsย ;
  • Fichiers de solution (.slnx) et de projet (.csproj) prรชts ร  รชtre compilรฉs.

Maintenant votre projet Mon application est prรชt ร  recevoir les services, modules, entitรฉs et front-end que nous configurerons dans les prochaines รฉtapes. Avant de continuer, ouvrez la solution gรฉnรฉrรฉe et exรฉcutez dotnet build pour confirmer que les rรฉfรฉrences, les gรฉnรฉrateurs de sources, les modรจles, les fichiers de projet et la configuration initiale sont cohรฉrents.

Ajout de l'application web Backoffice

Un systรจme complet nรฉcessite gรฉnรฉralement au moins une application Web pour faire fonctionner le domaine. Dans ce guide, l'application s'appelle Backoffice et reprรฉsente une interface interne permettant aux administrateurs, aux gestionnaires ou aux utilisateurs opรฉrationnels de surveiller les produits, les catรฉgories, les stocks, les ventes et d'autres informations du systรจme.

L'application Web ne remplace pas les services de domaine. Il fait office de point d'entrรฉe visuel pour consommer des API, dรฉclencher des Commands, consulter des Queries et afficher des รฉcrans cohรฉrents avec les rรจgles dรฉjร  modรฉlisรฉes dans les services.

ร‰tape 1ย : Exรฉcuter la commande de crรฉation

Pour ajouter une nouvelle application web au projet, utilisez :

lino web-app new

L'alias lino webapp new est รฉgalement disponible pour faciliter la saisie. Pendant l'exรฉcution, indiquez un nom clair pour l'application web ; dans cet exemple, nous utiliserons Backoffice.

lino web-app new --name Backoffice

ร‰tape 2ย : Comprendre la structure gรฉnรฉrรฉe

ร€ la fin du processus, Lino crรฉe la structure initiale de la Web App dans src/WebApps/<WebAppName>. Pour une application Blazor, la structure peut inclure des projets server/client, des ressources partagรฉes, des fichiers de localisation, des clients pour consommer les APIs et des conventions qui seront ensuite utilisรฉes par lino page new.

  • Dossiers pour les pages, les composants, les mises en page, les services et les ressources d'applicationย ;
  • Clients HTTP et contrats requis pour consommer les API exposรฉs par les services du projetย ;
  • Ressources de localisation et modรจles initiaux utilisรฉs par l'expรฉrience Webย ;
  • Projets client/serveur lorsque le type d'application nรฉcessite cette sรฉparation ;
  • Conventions de routage, de navigation et d'intรฉgration qui seront rรฉutilisรฉes dans la gรฉnรฉration des pagesย ;
  • Points d'intรฉgration avec authentification et autorisation lorsque la fonctionnalitรฉ d'authentification est ajoutรฉe au projet.

ร‰tape 3ย : Quand crรฉer lโ€™application Web dans le flux

Si vous savez dรฉjร  que le systรจme aura une interface Blazor, crรฉez la Web App dรจs le dรฉbut, aprรจs la crรฉation du projet. Ainsi, les services, modules, entitรฉs, APIs et pages gรฉnรฉrรฉs ensuite seront dรฉjร  alignรฉs avec l'application web qui les consommera.

Ce flux est particuliรจrement utile parce que les services crรฉรฉs par la suite gรฉnรจrent aussi des projets typรฉs Api.Contracts et Api.Client, consommรฉs par le projet Blazor. Avec la Web App prรฉsente dรจs le dรฉpart, il devient plus simple de valider le parcours complet : domaine, API, contrats, HttpClient et รฉcran.

Remarques importantes

  • Le Backoffice doit consommer les donnรฉes via les API gรฉnรฉrรฉs, en maintenant la logique mรฉtier dans les services et modules appropriรฉs.
  • Avant d'exposer les pages d'administration, vรฉrifiez l'authentification, l'autorisation, les rรดles, les autorisations et les stratรฉgies d'accรจs.
  • Vous pouvez crรฉer plusieurs applications Web, par exemple un Backoffice interne et un Site public, lorsque les audiences, les autorisations, les dรฉploiements ou les responsabilitรฉs sont diffรฉrents.
  • ร‰vitez de mรฉlanger les flux publics et administratifs dans une mรชme Web App lorsque cela rend difficile la sรฉcuritรฉ, la navigation, le dรฉploiement ou l'appropriation des รฉquipes.

Une fois l'application web crรฉรฉe, le guide peut passer aux services et modules qui fourniront les donnรฉes et les rรจgles mรฉtier consommรฉes par cette interface.

Crรฉation de services et de modules

Dans cette รฉtape, nous allons construire les services et modules qui composeront lโ€™application. L'objectif est de crรฉer une architecture modulaire et รฉvolutive, permettant aux diffรฉrents domaines du systรจme, tels que les produits, les catรฉgories, les stocks, les ventes et les mรฉdias, d'รฉvoluer de maniรจre indรฉpendante, en maintenant la cohรฉsion et en facilitant la maintenance. Les services dรฉfinissent les limites de dรฉploiement et de persistanceย ; Les modules organisent les domaines d'activitรฉ au sein d'un service modulaire. Avant de crรฉer des fichiers, รฉvaluez quelles parties du domaine nรฉcessitent leur propre base de donnรฉes, une version indรฉpendante, un accord d'intรฉgration ou une propriรฉtรฉ distincte.

ร‰tape 1: Dรฉfinir les services

Dans un premier temps, nous crรฉerons les services suivants, chacun avec des responsabilitรฉs bien dรฉfinies:

  • Catalog (modulaire) โ€“ responsable de la gestion des produits, des catรฉgories et des prixย ;
  • Sales โ€“ responsable du traitement des ventes et des Commandsย ;
  • Action โ€“ responsable de la gestion des stocks et des mouvements ;
  • Security โ€“ responsable de lโ€™authentification, de lโ€™autorisation et de la gestion des utilisateurs.

Pour crรฉer les services de l'exemple, exรฉcutez une commande pour chaque service. Dans le wizard de Catalog, choisissez l'architecture modulaire ; pour les autres, choisissez l'architecture adaptรฉe ร  une frontiรจre simple.

lino service new --name Catalog
lino service new --name Sales
lino service new --name Stock
lino service new --name Security

Pendant l'exรฉcution de la commande, le CLI demandera :

  • Nom du service : par exemple, Catalog ;
  • Nom d'affichage et style architectural : choisissez une architecture simple pour les frontiรจres compactes, ou modulaire lorsque le service possรจde des zones cohรฉsives indรฉpendantes ;
  • Base de donnรฉes : choisissez la technologie qui convient le mieux ร  votre projet (SQL Server, PostgreSQL, etc.) ;

ร‰tape 2 : Crรฉation de modules dans les services

Tous les services n'ont pas besoin d'รชtre modulaires. Dans notre projet, seul le service Catalog aura des modules, afin de sรฉparer des responsabilitรฉs comme le merchandising et la tarification.

Nous dรฉfinissons les modules suivants pour le service Catalog :

  • Merchandising โ€“ gestion des produits et des catรฉgories ;
  • Pricing โ€“ gestion des prix, des promotions et de l'historique des changements.

Pour crรฉer les modules de Catalog, exรฉcutez :

lino module new --service Catalog --name Merchandising
lino module new --service Catalog --name Pricing

Vous pouvez crรฉer autant de modules que vous le souhaitez au sein du service modulaire Catalog. De plus, en fonction de leur complexitรฉ, certains modules pourraient devenir des services indรฉpendants ร  l'avenir. La sรฉparation prรฉsentรฉe ici est uniquement ร  des fins didactiques et sert d'exemple d'organisation modulaire. Ne vous contentez pas d'utiliser des modules pour crรฉer des dossiersย ; utilisez-les lorsqu'ils protรจgent un domaine d'activitรฉ avec ses propres entitรฉs, cas d'utilisation, API, migrations et รฉvรฉnements.

Structure finale du projet

Aprรจs avoir crรฉรฉ les services et les modules, votre solution doit avoir une structure similaire ร  la suivanteย :

MyApp/
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ Aspire/
    โ”œโ”€โ”€ Integrations/
    โ”œโ”€โ”€ Services/
    โ”‚   โ”œโ”€โ”€ Catalog/
    โ”‚   โ”‚   โ”œโ”€โ”€ Modules/
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Merchandising/
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Pricing/
    โ”‚   โ”‚   โ”œโ”€โ”€ MyApp.Catalog.Host
    โ”‚   โ”‚   โ””โ”€โ”€ MyApp.Catalog.Infrastructure
    โ”‚   โ”œโ”€โ”€ Sales/
    โ”‚   โ”œโ”€โ”€ Security/
    โ”‚   โ”œโ”€โ”€ Shared/
    โ”‚   โ””โ”€โ”€ Stock/
    โ””โ”€โ”€ WebApps/
        โ”œโ”€โ”€ Backoffice/
        โ”‚   โ”œโ”€โ”€ Services/
        โ”‚   โ”‚   โ”œโ”€โ”€ Catalog/
        โ”‚   โ”‚   โ”œโ”€โ”€ Sales/
        โ”‚   โ”‚   โ”œโ”€โ”€ Security/
        โ”‚   โ”‚   โ””โ”€โ”€ Stock/
        โ”‚   โ”œโ”€โ”€ MyApp.WebApp.Backoffice
        โ”‚   โ””โ”€โ”€ MyApp.WebApp.Backoffice.Client
        โ””โ”€โ”€ Shared/
            โ””โ”€โ”€ MyApp.WebApp.Shared
โ””โ”€โ”€ tests/
    โ””โ”€โ”€ Services/
        โ”œโ”€โ”€ Catalog/
        โ”‚   โ”œโ”€โ”€ Merchandising/
        โ”‚   โ””โ”€โ”€ Pricing/
        โ”œโ”€โ”€ Sales/
        โ”œโ”€โ”€ Security/
        โ”œโ”€โ”€ Shared/
        โ””โ”€โ”€ Stock/

Explication de la structureย :

  • Services/: contient tous les services systรจme, chacun isolรฉ avec sa propre logique mรฉtier, sa propre infrastructure et son hรฉbergementย ;
  • Modules/: dossiers au sein de services modulaires, permettant d'organiser des fonctionnalitรฉs spรฉcifiques et de maintenir un code cohรฉrent ;
  • WebApps/: frontends associรฉs au systรจme, dรฉjร  intรฉgrรฉs aux services ;
  • Shared/: bibliothรจques et ressources partagรฉes entre services et frontends ;
  • tests/: tests unitaires et d'intรฉgration organisรฉs par service et module.

Grรขce ร  cette structure modulaire, chaque รฉquipe ou dรฉveloppeur peut travailler indรฉpendamment sur diffรฉrentes parties du systรจme, facilitant ainsi l'รฉvolutivitรฉ, la maintenance et les tests. Aprรจs avoir crรฉรฉ les services et les modules, exรฉcutez dotnet build pour confirmer que les projets sont correctement attachรฉs ร  la solution, hรฉbergez Aspire, les projets partagรฉs et le cadre de test.

Ajout d'authentification et d'autorisation

L'authentification et l'autorisation sont des รฉlรฉments essentiels de tout systรจme moderne. L'authentification prouve qui est l'utilisateurย ; l'autorisation dรฉfinit ce que cet utilisateur peut effectuer. Dans Lino CLI, la feature d'auth gรฉnรจre la base nรฉcessaire pour les utilisateurs, les rรดles, les autorisations, les jetons, les politiques d'accรจs et l'intรฉgration avec les API.

ร‰tape 1ย : Exรฉcuter la commande d'authentification

Pour ajouter des fonctionnalitรฉs d'authentification et d'autorisation, utilisez la commandeย :

lino feature auth add

CLI vous guidera ร  travers les รฉtapes suivantesย :

  • Choix du service ou du module: vous devez indiquer oรน les artefacts d'authentification seront installรฉs. Dans notre exemple de projet, nous utilisons le service Security, qui centralise toute la logique de sรฉcuritรฉ du systรจme ;
  • Paramรจtres supplรฉmentairesย : crรฉation de tableaux d'utilisateurs, de rรดles, d'autorisations, de jetons et configuration des politiques d'accรจsย ;
  • Durรฉe de vie du jetonย : dรฉfinition de l'expiration du access token et du refresh token conformรฉment ร  la politique de sรฉcuritรฉ du produitย ;
  • Type d'identifiant utilisateurย : choisir le type utilisรฉ par le modรจle utilisateur et les contrats gรฉnรฉrรฉs.

ร‰tape 2ย : Structure gรฉnรฉrรฉe

Aprรจs avoir exรฉcutรฉ la commande, le service Security contiendra des fichiers et des dossiers tels queย :

  • Domaine/Entitรฉsย : agrรฉgats, entitรฉs et rรจgles pour les utilisateurs, les rรดles, les autorisations et les jetonsย ;
  • Infrastructure/Persistanceย : configurations de bases de donnรฉes, mappages Entity Framework et migrations pour les tables de sรฉcuritรฉย ;
  • Application: Commands, Queries, Handlers, services d'authentification, gรฉnรฉration de jetons, validation des informations d'identification et vรฉrifications des autorisationsย ;
  • API/Hรดteย : points de terminaison pour la connexion, la dรฉconnexion, l'enregistrement, le refresh token et les opรฉrations protรฉgรฉesย ;
  • Intรฉgration avec l'application Webย : prise en charge des flux authentifiรฉs lorsqu'une application Web est prรฉsente.

Grรขce ร  cela, votre application disposera d'une authentification robuste et d'un contrรดle d'accรจs granulaire, prรชte ร  prendre en charge plusieurs utilisateurs et diffรฉrents niveaux d'autorisations. Nรฉanmoins, le code gรฉnรฉrรฉ doit รชtre traitรฉ comme une base solide et non comme lโ€™examen de sรฉcuritรฉ final. Avant la production, examinez la durรฉe de vie du jeton, la conception des autorisations, la politique de mot de passe, HTTPS, les secrets, la limitation de dรฉbit, les journaux et les configurations de dรฉploiement.

Ajout de Background Jobs

Dans les systรจmes distribuรฉs et modulaires, comme celui que nous construisons Lino CLI, tous les services ne communiquent pas directement entre eux. Pour garantir la cohรฉrence et la fiabilitรฉ des รฉchanges dโ€™informations, nous utilisons des รฉvรฉnements dโ€™intรฉgration. Cependant, pour traiter ces รฉvรฉnements de maniรจre efficace et asynchrone, nous avons besoin Background Jobs.

Lino utilise la norme Outbox Pattern pour garantir que tous les messages gรฉnรฉrรฉs par les services sont enregistrรฉs de maniรจre fiable avant leur envoi. Avec cela, nous avons rรฉalisรฉ:

  • ร‰vitez la perte dโ€™รฉvรฉnements en cas de pannes ou de redรฉmarrages de servicesย ;
  • Assurez-vous que le mรชme message nโ€™est envoyรฉ quโ€™une seule foisย ;
  • Autoriser le retraitement des messages en cas d'รฉchec de livraisonย ;
  • Sรฉparez le traitement des รฉvรฉnements de la logique principale de lโ€™application, amรฉliorant ainsi les performances et lโ€™รฉvolutivitรฉ.

ร‰tape 1ย : Exรฉcuter la commande

Pour ajouter la prise en charge des Background Jobs ร  votre projet, exรฉcutez la commandeย :

lino feature background-job add

CLI vous demandera de sรฉlectionner le service sur lequel le travail en arriรจre-plan sera installรฉ. Gรฉnรฉralement, vous choisirez le service qui centralise la production รฉvรฉnementielle, comme Catalog ou Sales. Dans les options actuelles, l'assistant peut รฉgalement demander le module, la bibliothรจque de jobs, si les รฉvรฉnements Outbox doivent รชtre traitรฉs, le planning et la taille du lot. Le flux de modรจle actuel utilise Hangfire pour l'exรฉcution de tรขches rรฉcurrentes.

ร‰tape 2ย : Configuration de l'exรฉcution

Lors de la configuration, vous pourrez dรฉfinir:

  • Intervalle de vรฉrificationย : dรฉtermine la frรฉquence ร  laquelle le travail en arriรจre-plan vรฉrifiera la table Outbox pour les nouveaux messages. Un intervalle trop court peut augmenter l'utilisation des ressources, tandis qu'un intervalle trop long peut retarder la livraison des รฉvรฉnementsย ;
  • Lot d'enregistrements traitรฉs ร  la foisย : contrรดle le nombre dโ€™รฉvรฉnements qui seront lus et envoyรฉs par exรฉcution. Des lots plus volumineux peuvent augmenter les performances, mais nรฉcessitent plus de mรฉmoire et de traitement ;
  • Politique de rรฉcupรฉrationย : En cas d'รฉchec de l'envoi de messages, vous pouvez configurer le nombre de tentatives de renvoi du travail.

Ces paramรจtres dรฉpendent de la taille de votre systรจme, de la capacitรฉ de la machine et du volume d'รฉvรฉnements attendu.

ร‰tape 3ย : Structure gรฉnรฉrรฉe

Aprรจs la configuration, le projet disposera d'un travail en arriรจre-plan prรชt ร  traiter les messages des tables. Outbox dans chaque prestation.

  1. Le cas d'utilisation modifie le domaine et enregistre un รฉvรฉnement de domaine ou d'intรฉgration.
  2. L'unitรฉ de travail enregistre les donnรฉes mรฉtiers et les messages de Outbox dans la mรชme transaction.
  3. Hangfire exรฉcute des tรขches rรฉcurrentes qui lisent les messages en attente par lots.
  4. Les messages sont publiรฉs sur le moteur d'intรฉgration configurรฉ tel que RabbitMQ lorsque la communication asynchrone est activรฉe.
  5. Les messages terminรฉs, รฉchouรฉs, anciens ou bloquรฉs peuvent รชtre traitรฉs par la logique et la configuration gรฉnรฉrรฉes pour la tรขche.

Cela garantit que tous les รฉvรฉnements d'intรฉgration sont traitรฉs de maniรจre fiable et efficace, permettant ร  plusieurs services et modules de communiquer de maniรจre asynchrone, sans affecter les performances du systรจme principal. La rรจgle opรฉrationnelle la plus importante est de garder la frontiรจre transactionnelle claire: les รฉvรฉnements qui doivent รชtre envoyรฉs via Outbox doivent รชtre crรฉรฉs dans le mรชme flux transactionnel que le changement mรฉtier qu'ils reprรฉsentent.

Crรฉation d'entitรฉs et d'รฉnumรฉrations

Dans cette section, nous dรฉtaillerons la conception des entitรฉs, des รฉnumรฉrations et des Value Objects de l'application, en montrant dans quels services et modules chaque รฉlรฉment sera crรฉรฉ.

1. Crรฉation de l'entitรฉ Category

Pour crรฉer l'entitรฉ Category dans le service Catalog et le module Merchandising, exรฉcutez :

lino entity new --service Catalog --module Merchandising --name Category

L'entitรฉ sera crรฉรฉe dans le service Catalog et dans le module Merchandising avec la structure suivante:

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type   โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid   โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string โ”‚   50   โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. Crรฉation de l'entitรฉ Product

Ensuite, nous crรฉons l'entitรฉ Product dans le mรชme service et le mรชme module. Dans ce flux, le Value Object ProductDimension et l'enum ProductStatus sont configurรฉs dans le wizard de crรฉation de l'entitรฉ lui-mรชme, comme partie de l'agrรฉgat Product :

lino entity new --service Catalog --module Merchandising --name Product

Pendant l'exรฉcution, ajoutez les propriรฉtรฉs simples, la relation avec Category, la propriรฉtรฉ Dimensions de type Value Object et la propriรฉtรฉ Status de type Enum.

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type        โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid        โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string      โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Description   โ”‚ string      โ”‚  500   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal     โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ CategoryId    โ”‚ Category    โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Dimensions    โ”‚ ValueObject โ”‚        โ”‚          โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Status        โ”‚ Enum        โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.1 Configuration du Value Object ProductDimension dans Product

Dans le scรฉnario de ce guide, ProductDimension n'est pas crรฉรฉ par une commande sรฉparรฉe. Il est ajoutรฉ pendant le lino entity new de Product, comme propriรฉtรฉ Dimensions, et reprรฉsente les dimensions du produit :

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Property name โ”‚ Type    โ”‚ Length โ”‚ Required โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Width         โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Height        โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Depth         โ”‚ decimal โ”‚        โ”‚    x     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Remarque : la commande lino value-object new existe pour les scรฉnarios oรน le Value Object doit รชtre crรฉรฉ sรฉparรฉment. Dans ces cas, utilisez les arguments du service et du module de destination :

lino value-object new --service <ServiceName> --module <ModuleName> --name <ValueObjectName>

2.2 Configuration de l'Enum ProductStatus dans Product

De la mรชme maniรจre, ProductStatus est configurรฉe dans le lino entity new de Product, comme propriรฉtรฉ Status. Elle dรฉfinit le statut du produit :

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Value โ”‚ Name         โ”‚ Display Name โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1     โ”‚ Active       โ”‚ Active       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 2     โ”‚ Inactive     โ”‚ Inactive     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 3     โ”‚ Discontinued โ”‚ Discontinued โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Remarque : la commande lino enumeration new peut aussi รชtre utilisรฉe lorsqu'une enum doit รชtre crรฉรฉe sรฉparรฉment dans un autre scรฉnario :

lino enumeration new --service <ServiceName> --module <ModuleName> --name <EnumerationName>

3. Ajout de nouvelles propriรฉtรฉs

Au fur et ร  mesure que le projet รฉvolue, nous pouvons modifier les entitรฉs existantes pour ajouter de nouvelles propriรฉtรฉs. Par exemple, nous ajouterons une liste d'images ร  l'entitรฉ Product:

lino entity edit --service Catalog --module Merchandising --entity Product

Dans ce mรชme flux, nous crรฉons la propriรฉtรฉ Images de type List<ProductImage>. Comme ProductImage appartient ร  l'agrรฉgat Product, sa structure est รฉgalement configurรฉe pendant le lino entity edit de Product :

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type               โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid               โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string             โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Description   โ”‚ string             โ”‚  500   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal            โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ CategoryId    โ”‚ EntityId           โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Dimensions    โ”‚ ValueObject        โ”‚        โ”‚          โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Status        โ”‚ Enum               โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ Images        โ”‚ List โ”‚        โ”‚          โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3.1 Configuration de ProductImage dans Product

ProductImage n'est pas crรฉรฉ par une commande sรฉparรฉe dans ce scรฉnario. Il est configurรฉ comme รฉlรฉment de la collection Images pendant l'รฉdition de Product et possรจde la structure suivante :

โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type           โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid           โ”‚        โ”‚    x     โ”‚       x        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚ x  โ”‚ ProductId     โ”‚ EntityId       โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ UploadDate    โ”‚ DateTimeOffset โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Image         โ”‚ File           โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Remarque : la commande lino entity new existe pour crรฉer des entitรฉs indรฉpendantes dans d'autres scรฉnarios. Lorsque l'entitรฉ ne fait pas partie de l'รฉdition d'un agrรฉgat existant, utilisez :

lino entity new --service <ServiceName> --module <ModuleName> --name <EntityName>

4. Crรฉation d'entitรฉs pour d'autres services

En service Sales, nous crรฉons l'entitรฉ ProductSnapshot, qui sera alimentรฉ par des รฉvรฉnements dโ€™intรฉgration. Comme identifiant d'origine de l'entitรฉ Product vient du service Catalog, il ne peut pas รชtre auto-incrรฉmental ici.

lino entity new --service Sales --name ProductSnapshot
โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ PK โ”‚ FK โ”‚ Property name โ”‚ Type    โ”‚ Length โ”‚ Required โ”‚ Auto-increment โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ x  โ”‚    โ”‚ Id            โ”‚ Guid    โ”‚        โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Name          โ”‚ string  โ”‚  100   โ”‚    x     โ”‚                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    โ”‚    โ”‚ Price         โ”‚ decimal โ”‚        โ”‚    x     โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Remarque : seuls les champs essentiels ont รฉtรฉ rรฉpliquรฉs dans ProductSnapshot pour le service Sales. Les entitรฉs complรฉmentaires, comme Customer, Order et StockItem, ne seront pas dรฉtaillรฉes ici afin de simplifier la documentation. ProductSnapshot fonctionne comme une shadow entity : une copie locale, minimale et contrรดlรฉe de donnรฉes dont le propriรฉtaire se trouve dans un autre service. Cela permet ร  Sales de consulter les donnรฉes produit nรฉcessaires sans dรฉpendre directement de l'entitรฉ ou de la base de donnรฉes de Catalog.

Ce type de structure pourrait aussi รชtre crรฉรฉ par la commande lino shadow new, alias de lino shadow-entity new. Dans ce flux, Lino copie la structure d'une entitรฉ d'un autre service ou module et permet de sรฉlectionner uniquement les propriรฉtรฉs pertinentes pour le contexte consommateur.

lino shadow new --service <ServiceName> --module <ModuleName> --name <ShadowEntityName>

Dans l'exemple, l'entitรฉ source est Catalog.Merchandising.Product et la destination est le service Sales, en conservant seulement les champs nรฉcessaires aux ventes.

Crรฉation d'รฉvรฉnements et de leurs Handlers

Pour rรฉcapituler, dans la section prรฉcรฉdente nous avons crรฉรฉ un service modulaire Catalog.Merchandising les entitรฉs Product, Category et ProductImage, pendant mon service Sales nous crรฉons l'entitรฉ ProductSnapshot.

Crรฉons maintenant des รฉvรฉnements de domaine et des รฉvรฉnements d'intรฉgration. L'objectif est que lors de la crรฉation ou de la mise ร  jour de produits sur le service Catalog, ces changements sont rรฉpliquรฉs aux services grand public, tels que Sales et Action.

1. Crรฉation d'รฉvรฉnements de domaine

La premiรจre รฉtape consiste ร  crรฉer des รฉvรฉnements de domaine ProductCreated et ProductUpdated avec la commande:

lino event new

Lors de la crรฉation, nous pouvons associer l'รฉvรฉnement ร  un gestionnaire et, simultanรฉment, configurer le dรฉclenchement d'un รฉvรฉnement d'intรฉgration. Cela centralise la crรฉation de tous les flux nรฉcessaires.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                             โ”‚ Answer                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                                    โ”‚ Catalog                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                                     โ”‚ Merchandising                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                                     โ”‚ Product                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                               โ”‚ Domain Event                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductCreated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Do you want to create an associated event handler?   โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Trigger a integration event?                         โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the integration event to be triggered:        โ”‚ (Create new integration event) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductCreated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Which model will be used for this integration event? โ”‚ Creation model                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

De la mรชme maniรจre, nous crรฉons l'รฉvรฉnement ProductUpdated:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                             โ”‚ Answer                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                                    โ”‚ Catalog                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                                     โ”‚ Merchandising                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                                     โ”‚ Product                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                               โ”‚ Domain Event                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductUpdated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Do you want to create an associated event handler?   โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Trigger a integration event?                         โ”‚ Yes                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the integration event to be triggered:        โ”‚ (Create new integration event) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event:                         โ”‚ ProductUpdated                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Which model will be used for this integration event? โ”‚ Update model                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Avec cela, nous avons:

  • ร‰vรฉnements de domaine crรฉรฉs (ProductCreated et ProductUpdated);
  • Handlers d'รฉvรฉnements de domaine correspondantsย ;
  • Les รฉvรฉnements d'intรฉgration sont automatiquement consignรฉs dans Outbox par le gestionnaire d'รฉvรฉnements de domaine.

2. Crรฉation de Handlers d'รฉvรฉnements d'intรฉgration

L'รฉtape suivante consiste ร  dรฉfinir quels services consommeront les รฉvรฉnements d'intรฉgration. Pour ce faire, nous utilisons:

lino event-handler new

Le flux de crรฉation impliqueย :

  • Sรฉlectionnez le service, le module et l'entitรฉ qui contiendront le gestionnaireย ;
  • Sรฉlectionnez l'รฉvรฉnement d'intรฉgration qui sera consommรฉ et de quel service/module/entitรฉ il proviendra.

Par exemple, dans le service Sales nous avons crรฉรฉ les Handlers pour ProductCreated et ProductUpdated qui consommera les รฉvรฉnements dรฉclenchรฉs par le Catalog.Merchandising.Product:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                   โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                          โ”‚ Sales             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                           โ”‚ ProductSnapshot   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                     โ”‚ Integration Event โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's service to be consumed: โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's module to be consumed:  โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's entity to be consumed:  โ”‚ Product           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the event to be consumed:           โ”‚ ProductCreated    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event handler:       โ”‚ ProductCreated    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                   โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                          โ”‚ Sales             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a entity:                           โ”‚ ProductSnapshot   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event type:                     โ”‚ Integration Event โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's service to be consumed: โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's module to be consumed:  โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select the event's entity to be consumed:  โ”‚ Product           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Choose the event to be consumed:           โ”‚ ProductUpdated    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Enter the name of the event handler:       โ”‚ ProductUpdated    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Avec cela, nous avons deux Handlers d'รฉvรฉnements d'intรฉgration dans le service Sales, en consommant uniquement les champs nรฉcessaires des รฉvรฉnements d'intรฉgration du Catalog.Merchandising. Cela garantit que les tables rรฉpliquรฉes conservent uniquement les donnรฉes essentielles, optimisant ainsi le stockage et les performances. En termes d'architecture, le flux attendu est le suivantย : le gestionnaire de Commands modifie l'agrรฉgat, l'รฉvรฉnement de domaine est dรฉclenchรฉ, le gestionnaire prรฉpare l'รฉvรฉnement d'intรฉgration, le Outbox stocke le message, le travail en arriรจre-plan traite le problรจme et le moteur de messagerie transmet le message aux consommateurs. Cela รฉvite le couplage synchrone entre services et rรฉduit le risque de modification de la base de donnรฉes sans que l'รฉvรฉnement correspondant soit publiรฉ.

Gรฉnรฉration de pages Web, API, Commands et Queries

L'un des grands avantages de Lino CLI est de permettre la crรฉation intรฉgrรฉe de pages Web, de API, de Commands et de Queries de maniรจre automatisรฉe, simplifiant ainsi l'ensemble du flux de dรฉveloppement. Lorsque le modรจle de domaine est suffisamment stable, cette commande crรฉe un chemin complet depuis l'รฉcran jusqu'ร  la persistance, rendant le travail de modรฉlisation effectuรฉ lors des รฉtapes prรฉcรฉdentes visible ร  l'utilisateur final. Pour commencer, exรฉcutez simplement la commandeย :

lino page new

Au cours du processus, vous:

  • Sรฉlectionnez le service, le module et l'entitรฉ que vous souhaitez exposerย ;
  • Choisissez le type et le nom de la page qui sera gรฉnรฉrรฉeย ;
  • Choisissez les champs qui feront partie de la listeย ;
  • Gรฉnรฉrer automatiquement des pages de listing (grille paginรฉe) et un formulaire de crรฉation/รฉditionย ;
  • Gรฉnรฉrer des classes HttpClient pour la consommation par le frontendย ;
  • Crรฉer des contrats de demande/rรฉponse et tous les REST API nรฉcessaires (POST, PUT, PATCH, DELETE et GET)ย ;
  • Crรฉez des Commands, des Queries, des Handlers et des validateurs, qui vont ร  la base de donnรฉes assurant le flux CRUD complet.

Avec cette commande, vous obtenez une application fonctionnelle sans avoir ร  รฉcrire manuellement la couche d'interface, les API et la logique mรฉtier, en maintenant le standard et la cohรฉrence entre les services. Nรฉanmoins, examinez les rรจgles mรฉtier et les validations aprรจs la gรฉnรฉration, car toutes les rรจgles ne peuvent pas รชtre dรฉduites des seules mรฉtadonnรฉes de propriรฉtรฉ.

Pour ce projet, nous pouvons gรฉnรฉrer des pages intรฉgrรฉes pour les entitรฉs suivantesย :

  • Catalog.Merchandising.Category
  • Catalog.Merchandising.Product
  • Sales.ProductSnapshot

Aprรจs avoir gรฉnรฉrรฉ les pages, les API et les Commands/Queries, l'application sera prรชte ร  interagir complรจtement entre frontend et backend, avec des validations, des routes et une persistance dรฉjร  configurรฉes automatiquement par le Lino CLI. Courir dotnet build aprรจs gรฉnรฉration pour identifier rapidement les rรฉfรฉrences rompues, les contrats incohรฉrents ou les impacts des modifications rรฉcentes du modรจle.

Crรฉation et application de migrations

Aprรจs avoir crรฉรฉ ou modifiรฉ des entitรฉs, des Value Objects, des รฉnumรฉrations, des relations, l'authentification, la prise en charge des locataires ou la persistance des Background Jobs, gรฉnรฉrez des migrations pour maintenir la base de donnรฉes et le code alignรฉs. La migration transforme le changement de modรจle en un artefact explicite, versionnable et rรฉvisable.

Lino CLI coordonne ce processus avec Entity Framework, en sรฉlectionnant le bon service/module, en utilisant la version actuelle du service et en organisant les scripts gรฉnรฉrรฉs pour faciliter la traรงabilitรฉ.

ร‰tape 1ย :ย Crรฉer une migration

Pour crรฉer une nouvelle migration, exรฉcutezย :

lino database migrations add

La commande peut รฉgalement accepter des alias comme lino database migrations new et lino database migrations create, mais la mรฉthode prรฉfรฉrรฉe dans la documentation est add.

Lors de l'exรฉcution, vous devez informer:

  • Le service qui recevra la migration, par exemple Catalog;
  • Le module concernรฉ, lorsque le service est modulaire, par ex. Merchandising;
  • La version actuelle du service, lue ร  partir de src/Services/<ServiceName>/version.txt;
  • Une description objective de la migration, telle que Initial migration ou Add product images.
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Question                                  โ”‚ Answer            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a service:                         โ”‚ Catalog           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Select a module:                          โ”‚ Merchandising     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Current version of the service:           โ”‚ 0.1.0             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Provide a description for this migration: โ”‚ Initial migration โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Lorsque vous connaissez dรฉjร  le service et le module, vous pouvez saisir directement ces donnรฉes:

lino database migrations add --service <ServiceName> --module <ModuleName>

ร‰tape 2ย :ย ce qui est gรฉnรฉrรฉ

Lors de la confirmation de la crรฉation, Lino prรฉpare les Commands Entity Framework correctes pour le projet de persistance de service ou de module sรฉlectionnรฉ. Dans un service modulaire, la migration reste isolรฉe dans le module correspondant, รฉvitant de mรฉlanger les changements issus de contextes diffรฉrents.

  • Une nouvelle migration de base de donnรฉes associรฉe ร  la version actuelle du serviceย ;
  • Le script SQL correspondant, organisรฉ dans la couche de persistance, dans un chemin versionnรฉ comme /scripts//;
  • Artefacts compatibles avec la structure Infrastructure/Persistance du service ou module sรฉlectionnรฉย ;
  • Historique traรงable pour relier la version du service, les modifications de schรฉma et la version de l'application.

ร‰tapeย 3ย : Rรฉpertorier et appliquer les migrations

Avant d'appliquer des modifications ร  une base de donnรฉes, rรฉpertoriez les migrations connues et confirmez que la migration attendue est prรฉsenteย :

lino database migrations list --service <ServiceName> --module <ModuleName>

Pour appliquer les migrations ร  l'environnement configurรฉย :

lino database migrations apply --service <ServiceName> --module <ModuleName>

En dรฉveloppement local, ce flux accรฉlรจre la validation du modรจle. Dans des environnements partagรฉs ou de production, appliquez les migrations via le processus de dรฉploiement dรฉfini par l'รฉquipe, avec rรฉvision, approbation et sauvegarde du script si nรฉcessaire.

ร‰tape 4ย :ย Inversion ou suppression dans un environnement contrรดlรฉ

Utiliser revert lorsqu'il faut restituer une migration appliquรฉe dans un environnement contrรดlรฉ, sachant que l'opรฉration peut exรฉcuter des Commands destructrices en fonction du contenu de la migration:

lino database migrations revert --service <ServiceName> --module <ModuleName>

Utiliser remove pour ignorer la derniรจre migration non validรฉe, gรฉnรฉralement avant de valider ou de publier la modificationย :

lino database migrations remove --service <ServiceName> --module <ModuleName>

Bonnes pratiques

  • Crรฉez des migrations chaque fois que des modifications sont apportรฉes au modรจle persistantย : nouvelles entitรฉs, propriรฉtรฉs, relations, index, contraintes, tables d'authentification ou tables Outbox.
  • Vรฉrifiez le code et le SQL gรฉnรฉrรฉs avant de les appliquer aux environnements partagรฉs.
  • Portez une attention particuliรจre aux changements de nom, aux modifications de type, aux suppressions de colonnes, aux modifications de clรฉ, aux modifications de schรฉma et aux opรฉrations pouvant entraรฎner une perte de donnรฉes.
  • Gardez la version du service alignรฉe sur les scripts gรฉnรฉrรฉs pour faciliter l'audit, la restauration planifiรฉe et la communication sur les versions.
  • Aprรจs avoir crรฉรฉ la migration, exรฉcutez la build et les tests pertinents pour confirmer que le domaine, la persistance, les API et les pages gรฉnรฉrรฉes restent cohรฉrents.

En suivant ce flux, la base de donnรฉes reste cohรฉrente avec le modรจle de domaine dรฉfini dans Lino, et chaque modification de schรฉma est documentรฉe, traรงable et prรชte ร  รชtre examinรฉe avant le dรฉploiement.

ร‰tape 5 : Validation locale de l'application

Avec le projet, la Web App, les services, modules, entitรฉs, migrations, APIs, Commands et Queries prรชts, validez l'application avant de gรฉnรฉrer les images Docker. Commencez par compiler la solution pour confirmer que tous les projets, contrats et clients gรฉnรฉrรฉs restent cohรฉrents :

dotnet build

Ensuite, exรฉcutez l'application via l'AppHost Aspire :

dotnet run --project src/Aspire/AppHost/<ProjectName>.AppHost.csproj

Utilisez le dashboard Aspire pour vรฉrifier que les APIs, la Web App, la base de donnรฉes, le cache, la messagerie et les Background Jobs ont dรฉmarrรฉ correctement. Ensuite, testez les flux principaux dans le Backoffice : pages gรฉnรฉrรฉes, appels Blazor vers les projets Api.Client, migrations appliquรฉes, authentification lorsqu'elle est activรฉe, et รฉvรฉnements ou jobs lorsqu'ils font partie du scรฉnario.

Lorsque l'application compile, s'exรฉcute localement et que les flux principaux sont validรฉs, le projet est prรชt pour l'รฉtape de packaging.

Gรฉnรฉration d'images Docker

Une fois que l'application compile, s'exรฉcute localement via l'AppHost et que les flux principaux ont รฉtรฉ testรฉs, vous pouvez gรฉnรฉrer les images Docker des services et applications web pour une publication ultรฉrieure dans un registre de conteneurs. Utilisez lino build lorsque les รฉlรฉments sรฉlectionnรฉs sont prรชts ร  รชtre empaquetรฉs comme images.

Lino CLI simplifie ce processus avec la commandeย :

lino build

Une fois exรฉcutรฉ, vous verrez une liste de tous les services et applications Web disponibles dans le projet, ainsi que leurs versions actuellesย :

Select the services or web applications you want to include in the build:

> [ ] Services
    [ ] Catalog |0.1.0|
    [ ] Sales |0.1.0|
    [ ] Security |0.1.0|
    [ ] Stock |0.1.0|
  [ ] Web applications
    [ ] Backoffice |0.1.0|

Vous pouvez sรฉlectionner un ou plusieurs services et applications Web pour gรฉnรฉrer des images simultanรฉment. Marquez simplement les รฉlรฉments souhaitรฉs.

Il vous sera alors demandรฉ de choisir comment vous souhaitez mettre ร  jour la version des images gรฉnรฉrรฉes. Les options disponibles sontย :

  • Conserver la version actuelle โ€“ ne modifie pas la version existante ;
  • Correctif โ€“ incrรฉmente la version du patch (ex: 0.1.0 โ†’ 0.1.1) ;
  • Mineure โ€“ incrรฉmente la version mineure (ex: 0.1.0 โ†’ 0.2.0) ;
  • Majeur โ€“ incrรฉmente la version majeure (ex: 0.1.0 โ†’ 1.0.0).

Aprรจs avoir sรฉlectionnรฉ les services et dรฉfini l'incrรฉment de version, le Lino CLI effectue:

  • Construire le code pour chaque service et application Webย ;
  • Gรฉnรฉration de l'image Docker correspondanteย ;
  • Application du tag avec la version dรฉfinieย ;
  • Rendre les images disponibles pour publication dans votre registre de conteneursย ;
  • Utilisation de paramรจtres de publication tels que -c Release, -p:PublishProfile=DefaultContainer, -p:ContainerRepository, -p:ContainerImageTag et -p:ContainerLabelVersion, selon le type de projet gรฉnรฉrรฉ.

ร€ la fin du processus, รฉtant donnรฉ que tous les services et applications Web ont รฉtรฉ sรฉlectionnรฉs, les images gรฉnรฉrรฉes auront la structure suivanteย :

  • mon-app/services/catalog-host - baliseย : 0.1.0
  • mon-app/services/sales-api - baliseย : 0.1.0
  • mon-app/services/security-api - baliseย : 0.1.0
  • mon-app/services/Stock-api - baliseย : 0.1.0
  • mon-app/webapps/backoffice - baliseย : 0.1.0

De maniรจre gรฉnรฉrale, les services simples ont tendance ร  gรฉnรฉrer des rรฉfรฉrentiels comme project-name/services/service-name-api:1.2.3, les services modulaires utilisent des hรดtes comme project-name/services/service-name-host:1.2.3, et les applications Blazor utilisent des chemins tels que project-name/webapps/webapp-name:1.2.3.

Observation: Ce processus garantit la cohรฉrence entre le code et la version des images Docker, facilitant le dรฉploiement et la maintenance de plusieurs environnements, en plus de permettre ร  chaque service d'รชtre isolรฉ dans des conteneurs indรฉpendants. Une fois l'image locale gรฉnรฉrรฉe, publiez-la dans le registre utilisรฉ par votre plateforme de dรฉploiement, tel que Docker Hub, GitHub Container Registry, AWS ECR, Azure Container Registry ou un autre registre compatible OCI. N'incluez pas de secrets, de chaรฎnes de connexion de production ou d'informations d'identification dans l'image.

Crรฉation de versions dans l'application

Lino conserve la version de travail de chaque service dans src/Services/<ServiceName>/version.txt et chaque application Web dans src/WebApps/<WebAppName>/version.txt. Cela vous permet de planifier des versions indรฉpendantes pour chaque รฉlรฉment dรฉployable.

Avant de changer de version, inspectez l'รฉtat actuelย :

lino version list

Utiliser lino version show lorsque vous avez besoin de consulter un service ou une application Web spรฉcifique.

L'incrรฉmentation de nouvelles versions de services ou d'applications Web est un processus simple et centralisรฉ. Lino CLI. Exรฉcutez simplement la commandeย :

lino version bump

Tout comme pour gรฉnรฉrer des images Docker, lorsque vous exรฉcutez cette commande, vous verrez une liste complรจte de tous les services et applications Web de votre projet. Seuls les รฉlรฉments que vous sรฉlectionnez verront leur version augmentรฉe, tandis que le reste restera inchangรฉ.

Select the services or web applications that will have version changes:

> [ ] Services
    [ ] Catalog |0.1.0|
    [ ] Sales |0.1.0|
    [ ] Security |0.1.0|
    [ ] Stock |0.1.0|
  [ ] Web applications
    [ ] Backoffice |0.1.0|

Aprรจs avoir sรฉlectionnรฉ les รฉlรฉments souhaitรฉs, il vous sera demandรฉ de choisir le type d'incrรฉment de version. Les options disponibles sontย :

  • Correctif โ€“ petites corrections sans impact fonctionnel ;
  • Mineure โ€“ ajout de nouvelles fonctionnalitรฉs compatibles avec les versions prรฉcรฉdentes ;
  • Majeur โ€“ des modifications pouvant rompre la compatibilitรฉ avec les versions prรฉcรฉdentes.

Il est important de souligner que les versions des services web et des applications ont un impact direct sur:

  • Les balises d'image Dockerย ;
  • Les dossiers utilisรฉs pour stocker les scripts gรฉnรฉrรฉs par les migrations de bases de donnรฉesย ;
  • Contrรดle des versions et de l'historique du projetย ;
  • Notes de version, manifestes de dรฉploiement et communication avec les consommateurs API.

Avant d'appliquer une modification, examinez les modifications de code, les migrations, les รฉvรฉnements d'intรฉgration, les contrats API et les modifications frontales qui font partie de la version. Une version Correctif doit reprรฉsenter des correctifs compatibles, Mineure doit reprรฉsenter des ajouts compatibles, et Majeur il doit รชtre rรฉservรฉ aux changements qui nรฉcessitent une adaptation des consommateurs.

Avec cela, nous concluons le guide รฉtape par รฉtape de toutes les Commands essentielles pour crรฉer un projet Web ร  l'aide de Lino CLI, de l'installation, la crรฉation de services, d'entitรฉs, d'รฉvรฉnements et de pages, ร  la gรฉnรฉration et au versionnage d'images Docker. Le flux complet est traรงableย : domaine de modรฉlisation, gรฉnรฉration de cas d'utilisation et d'รฉcrans, validation avec des builds et des tests, crรฉation de migrations, publication d'images avec des balises de version et publication de chaque service ou application Web avec une valeur SemVer explicite.

N'oubliez pas de suivre notre chaรฎne sur YouTube pour suivre des tutoriels dรฉtaillรฉs, des dรฉmonstrations pratiques et des conseils d'utilisation de l'outil, des opรฉrations simples aux fonctionnalitรฉs avancรฉes.

Une erreur non gérée est survenue. Rafraîchir ๐Ÿ—™