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 trÚs simple :

lino new api

L’assistant interactif vous 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 – le modĂšle de route (ex. : /people/{id}).

Exemple :

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

  • Un endpoint avec un mapping HTTP.
  • Des DTO de requĂȘte/rĂ©ponse.
  • Des extensions pour l’intĂ©gration avec OpenAPI et la gestion de version.
  • Un HttpClient typĂ© pour une utilisation interne par d’autres services.

Structure générée :

MyApp/
└── src/
    ├── Services/
    │   └── MyService/
    │       └── Presentation.API/
    │           ├── MyApp.MyService.Presentation.API.csproj
    │           └── Endpoints/
    │               └── People/
    │                   └── CreatePerson/
    │                       ├── CreatePersonEndpoint.cs
    │                       ├── CreatePersonExtensions.cs
    │                       ├── CreatePersonRequest.cs
    │                       └── CreatePersonResponse.cs
    └── Integrations/
        └── MyService/
            └── Http/
                ├── Contracts/
                │   └── Apis/
                │       └── People/
                │           ├── IPersonHttpClient.cs
                │           └── CreatePerson/
                │               ├── CreatePersonRequest.cs
                │               └── CreatePersonResponse.cs
                └── Clients/
                    └── Apis/
                        └── PersonHttpClient.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 🗙