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ย :
- Si vous รชtes dรฉjร inscrit, connectez-vous avec:
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ย :
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ย :
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 :
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ย :
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.
- Le cas d'utilisation modifie le domaine et enregistre un รฉvรฉnement de domaine ou d'intรฉgration.
- L'unitรฉ de travail enregistre les donnรฉes mรฉtiers et les messages de Outbox dans la mรชme transaction.
- Hangfire exรฉcute des tรขches rรฉcurrentes qui lisent les messages en attente par lots.
- Les messages sont publiรฉs sur le moteur d'intรฉgration configurรฉ tel que RabbitMQ lorsque la communication asynchrone est activรฉe.
- 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:
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:
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ย :
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 :
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ย :
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ย :
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ย :
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.