Gestion de la Persistance des Données
Dans cette section, vous apprendrez comment Lino configure Entity Framework Core afin que la couche domaine reste totalement isolĂ©e et que les processus de migration de base de donnĂ©es soient prĂ©visibles et contrĂŽlĂ©s â que ce soit dans un service traditionnel (monolithique) ou dans un service modulaire.
Lors de la crĂ©ation dâun service via la commande lino new service, lâinterface CLI demande deux dĂ©cisions essentielles :
- Architecture â service traditionnel ou modulaire.
- Fournisseur de donnĂ©es â
SqlServerouPostgreSql(dâautres fournisseurs seront ajoutĂ©s dans de futures versions).
Dans les services traditionnels (monolithiques) ou modulaires (monolithiques modulaires), la base de donnĂ©es est unique par service. Cependant, dans les services modulaires, chaque module est mappĂ© dans un schĂ©ma distinct au sein de la mĂȘme base de donnĂ©es. Cela permet Ă chaque bounded context de conserver un espace de noms logique sĂ©parĂ©, garantissant ainsi lâisolation fonctionnelle, le versionnage indĂ©pendant et des migrations plus organisĂ©es et sĂ©curisĂ©es.
Configurations des types dâentitĂ©
Lino suit le principe PersistenceâIgnorant : les entitĂ©s du domaine ne connaissent pas les dĂ©tails de lâinfrastructure.
Pour cela, tout le mapping ORM est déplacé dans des classes qui implémentent IEntityTypeConfiguration<T>, situées dans Configurations/<EntityName>Configuration.cs.
- Chaque entité possÚde un fichier de configuration dédié.
- Les conventions globales (ex. :
decimal(18,2), collation,DateTimeenutc) peuvent ĂȘtre centralisĂ©es dansModelConfiguration. - Les configurations sont appliquĂ©es dans la mĂ©thode
OnModelCreatingduDbContextviamodelBuilder.ApplyConfigurationsFromAssembly(...).
DbContexts
Le DbContext reprĂ©sente l'unitĂ© de transaction de lâapplication. Lino gĂ©nĂšre automatiquement :
- Service traditionnel â un unique
AppDbContextcontenant tous lesDbSet<TEntity>. - Service modulaire â un
<Module>DbContextpar bounded context. Ainsi, chaque module compile plus rapidement, dispose de cycles de migration plus courts et réduit le risque de conflits de fusion.
Tous les DbContext sont enregistrés dans <Module>/Infrastructure.Persistence, exposés via IUnitOfWork et résolus par dependency injection.
Repositories
Les repositories concrets se trouvent dans <Module>/Infrastructure.Persistence.Repositories et implĂ©mentent les interfaces dĂ©finies dans lâespace de noms <Module>/Domain.Repositories.
Chaque repository :
- Encapsule des requĂȘtes complexes (LINQ,
FromSql, projections DTO). - Expose uniquement les mĂ©thodes nĂ©cessaires au domaine (centrĂ© sur lâAggregate Root).
Unité de Travail (Unit of Work)
L'Unité de Travail agit comme une frontiÚre transactionnelle qui coordonne plusieurs dépÎts, garantissant que toutes les opérations soient exécutées de maniÚre atomique.
Dans les scĂ©narios simples, le DbContext lui-mĂȘme est souvent suffisant. Cependant, Lino gĂ©nĂšre une implĂ©mentation dĂ©diĂ©e (UnitOfWork) offrant un meilleur contrĂŽle et une plus grande flexibilitĂ©.
- Permet le contrĂŽle manuel des transactions via
BeginTransaction,CommitetRollback, lorsque nĂ©cessaire. - Publie des Ă©vĂ©nements de domaine pendant la transaction en cours, garantissant qu'ils se produisent dans le mĂȘme cycle de
commit. - Persiste des événements d'intégration dans la boßte d'envoi (outbox), suivant le Transaction Outbox Pattern, assurant une livraison fiable dans les architectures distribuées (le cas échéant).
Gestion des migrations
Lino simplifie et automatise entiĂšrement le processus de migrations de base de donnĂ©es avec Entity Framework Core, Ă©liminant les tĂąches rĂ©pĂ©titives et les risques courants dâincohĂ©rence. Pour crĂ©er une nouvelle migration, exĂ©cutez la commande suivante :
lino database migrations add
Lorsque vous exécutez la commande, un assistant interactif vous demandera les informations suivantes :
- Service — Nom du projet oĂč la migration sera appliquĂ©e.
- Module — (uniquement pour les services modulaires) module auquel appartient la modification.
-
Nom de la migration — Indiquez une description du changement (ex. :
AddCustomerIsActive). Lino prendra automatiquement en charge la version actuelle et lâordre dâincrĂ©mentation lors de la gĂ©nĂ©ration du script.sql, suivant ce modĂšle :/Scripts/v1.2.3/001_AddCustomerIsActive.sql.
.cs générés par Entity Framework, Lino crée automatiquement le script .sql correspondant avec les instructions DDL.
Cela facilite lâexĂ©cution manuelle des modifications ou la rĂ©vision par les Ă©quipes dâinfrastructure et les DBA.
