Développement d’API

Les API sont le principal moyen d’exposer les fonctionnalitĂ©s d’un service dans l’écosystĂšme Lino.
Ce chapitre dĂ©crit comment le framework gĂ©nĂšre des Minimal APIs prĂȘtes Ă  l’emploi, comment l’enregistrement automatique via Source Generators fonctionne, et quelles pratiques nous recommandons pour crĂ©er des endpoints clairs, testables et bien documentĂ©s.

Minimal APIs

Lino adopte le style Minimal API comme standard pour la gĂ©nĂ©ration d’endpoints, en privilĂ©giant :

  • ClartĂ© – code concis, direct et expressif.
  • Performance – rĂ©ponses optimisĂ©es, sans surcharge inutile.

Fonctionnalités intégrées

TypedResults : garantissent des rĂ©ponses fortement typĂ©es, aidant Ă  la lisibilitĂ© et Ă  la gĂ©nĂ©ration d’OpenAPI.

Versionnement des API : les endpoints peuvent évoluer sans rompre la compatibilité.

Documentation enrichie : des métadonnées configurables sont directement incorporées dans OpenAPI, incluant :

  • WithTags → regroupe les endpoints en sections logiques dans OpenAPI.
  • WithName → dĂ©finit l’operationId de maniĂšre cohĂ©rente.
  • WithSummary → dĂ©crit clairement l’objectif de l’endpoint.
  • Produces(statusCode, schema) → spĂ©cifie les codes de statut et les contrats de rĂ©ponse.
  • MapToApiVersion → permet d’exposer diffĂ©rentes versions d’un mĂȘme endpoint.

Requests et Responses

Record classes sont utilisées par défaut pour les Requests et Responses :

  • Elles sont immuables (rĂ©duisant les effets secondaires et les bugs).
  • Elles sont concises et faciles Ă  lire.

Intégration avec CQRS :

  • Les Requests reçues via les endpoints sont transformĂ©es en Commands ou Queries.
  • Les rĂ©sultats des Commands/Queries sont convertis en Responses, favorisant la cohĂ©rence architecturale.

Exemple simplifié :
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

Création de nouvelles API

Créer un endpoint avec la CLI de Lino est simple :

lino new api

L’assistant interactif demandera :

  • Service – le service dans lequel l’API sera créée.
  • Module – le module du service (le cas Ă©chĂ©ant).
  • EntitĂ© – l’entitĂ© associĂ©e Ă  l’endpoint.
  • Nom de l’API – gĂ©nĂ©ralement alignĂ© sur le verbe de l’opĂ©ration (ex. : CreatePerson).
  • Type d’opĂ©ration – POST, PUT, PATCH, DELETE ou GET.
  • Route – modĂšle de route (ex. : /people/{id}).

Exemple :

Lors de la crĂ©ation d’une API POST nommĂ©e CreatePerson associĂ©e Ă  l’entitĂ© Person, la CLI gĂ©nĂšre automatiquement :

  • Un endpoint avec le mapping HTTP.
  • Des DTOs Request/Response.
  • Des extensions pour l’intĂ©gration avec OpenAPI et le versionnement.

Structure générée :

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Api/
                └── MyApp.MyService.Api.csproj
                    └── Endpoints/
                        └── People/
                            └── CreatePerson/
                                ├── CreatePersonEndpoint.cs
                                ├── CreatePersonExtensions.cs
                                ├── CreatePersonRequest.cs
                                └── CreatePersonResponse.cs

Dans les projets disposant d’applications Web Blazor, Lino gĂ©nĂšre automatiquement les artefacts nĂ©cessaires Ă  la consommation des API.
Cela inclut les contrats partagĂ©s (Request et Response/DTOs), l’interface du client et une implĂ©mentation standard pour les appels HTTP, permettant Ă  Blazor de consommer les API de maniĂšre simple, typĂ©e et cohĂ©rente.

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Api/
                ├── MyApp.MyService.Api.Contracts.csproj
                │   └── Features/
                │       └── People/
                │           ├── CreatePerson/
                │           │   ├── CreatePersonRequest.cs
                │           │   └── CreatePersonResponse.cs
                │           └── IPersonApiClient.cs
                └── MyApp.MyService.Api.Client.csproj
                    └── Features/
                        └── PersonApiClient.cs

Enregistrement des Endpoints avec Source Generators

Lino supprime le besoin de mapper manuellement les endpoints ou d’utiliser intensivement Reflection Ă  l’exĂ©cution.
À la place, il utilise les Source Generators pour gĂ©nĂ©rer automatiquement le code d’enregistrement lors de la compilation.

Comment ça fonctionne

Pour chaque endpoint créé, le générateur produit des classes/parties de classes qui appellent :
MapGet, MapPost, MapPut, MapDelete, etc.

Cela remplace la nĂ©cessitĂ© d’ajouter manuellement tous les mappages dans Program.cs.

Avantages :

  • Enregistrement Ă  la compilation → Ă©vite les erreurs Ă  l’exĂ©cution.
  • Program.cs Ă©purĂ© → surface de configuration manuelle rĂ©duite.
  • CompatibilitĂ© AOT → Ă©limine la dĂ©pendance Ă  Reflection.
  • Documentation intĂ©grĂ©e → les mĂ©tadonnĂ©es (tags, summary, produces) sont gĂ©nĂ©rĂ©es avec le mappage.

Ce modÚle garantit que les API créées dans Lino sont :

  • Auto-documentĂ©es
  • Performantes
  • Conformes Ă  l’architecture CQRS du framework
Une erreur non gérée est survenue. Rafraîchir 🗙