API-Entwicklung

APIs sind der Hauptweg, um die Funktionen eines Dienstes im Lino-Ökosystem bereitzustellen.
Dieses Kapitel beschreibt, wie das Framework einsatzbereite Minimal APIs erzeugt, wie die automatische Registrierung ĂŒber Source Generators erfolgt und welche Praktiken wir empfehlen, um klare, testbare und gut dokumentierte Endpunkte zu erstellen.

Minimal APIs

Lino verwendet standardmĂ€ĂŸig den Minimal API-Stil zur Erstellung von Endpunkten und legt dabei den Fokus auf:

  • Klarheit – schlanker, direkter und ausdrucksstarker Code.
  • Performance – optimierte Antworten ohne unnötigen Overhead.

Integrierte Funktionen

TypedResults: sorgen fĂŒr stark typisierte Antworten und unterstĂŒtzen die Lesbarkeit sowie die OpenAPI-Generierung.

API-Versionierung: Endpunkte können weiterentwickelt werden, ohne die KompatibilitÀt zu brechen.

Erweiterte Dokumentation: konfigurierbare Metadaten werden direkt in OpenAPI eingebunden, einschließlich:

  • WithTags → gruppiert Endpunkte in logische Abschnitte in OpenAPI.
  • WithName → definiert operationId konsistent.
  • WithSummary → beschreibt den Zweck des Endpunkts klar.
  • Produces(statusCode, schema) → spezifiziert Statuscodes und AntwortvertrĂ€ge.
  • MapToApiVersion → ermöglicht das Veröffentlichen verschiedener Versionen desselben Endpunkts.

Requests und Responses

Record classes werden standardmĂ€ĂŸig fĂŒr Requests und Responses verwendet:

  • Sie sind unverĂ€nderlich (reduziert Nebenwirkungen und Fehler).
  • Sie sind prĂ€gnant und leicht lesbar.

Integration mit CQRS:

  • Requests, die ĂŒber Endpunkte empfangen werden, werden in Commands oder Queries umgewandelt.
  • Die Ergebnisse von Commands/Queries werden in Responses umgewandelt, was die architektonische Konsistenz fördert.

Vereinfachtes Beispiel:
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

Erstellen neuer APIs

Das Erstellen eines Endpoints mit der Lino-CLI ist einfach:

lino new api

Der interaktive Assistent fragt nach:

  • Service – der Service, in dem die API erstellt wird.
  • Modul – das Modul des Services (falls zutreffend).
  • EntitĂ€t – die dem Endpoint zugeordnete EntitĂ€t.
  • API-Name – in der Regel am Operationsverb ausgerichtet (z. B. CreatePerson).
  • Operationstyp – POST, PUT, PATCH, DELETE oder GET.
  • Route – Routenmuster (z. B. /people/{id}).

Beispiel:

Beim Erstellen einer POST-API mit dem Namen CreatePerson, die der EntitÀt Person zugeordnet ist, generiert die CLI automatisch:

  • Endpoint mit HTTP-Zuordnung.
  • Request-/Response-DTOs.
  • Erweiterungen fĂŒr OpenAPI-Integration und Versionierung.

Generierte Struktur:

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

In Projekten mit hinzugefĂŒgten Blazor-Webanwendungen generiert Lino automatisch die erforderlichen Artefakte fĂŒr den API-Verbrauch.
Dazu gehören gemeinsam genutzte VertrĂ€ge (Request- und Response-/DTOs), die Client-Schnittstelle sowie eine Standardimplementierung fĂŒr HTTP-Aufrufe, sodass Blazor die APIs einfach, typisiert und konsistent konsumieren kann.

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

Registrierung von Endpunkten mit Source Generators

Lino beseitigt die Notwendigkeit, Endpunkte manuell zu mappen oder Reflection zur Laufzeit intensiv zu nutzen.
Stattdessen werden Source Generators verwendet, um den Registrierungscode automatisch wÀhrend der Kompilierung zu erzeugen.

Wie es funktioniert

FĂŒr jeden erstellten Endpunkt erzeugt der Generator Klassen/Teilklassen, die aufrufen:
MapGet, MapPost, MapPut, MapDelete usw.

Dies ersetzt die Notwendigkeit, alle Mappings manuell in Program.cs hinzuzufĂŒgen.

Vorteile:

  • Registrierung zur Kompilierzeit → verhindert Laufzeitfehler.
  • Schlankes Program.cs → geringere manuelle KonfigurationsoberflĂ€che.
  • AOT-KompatibilitĂ€t → beseitigt die AbhĂ€ngigkeit von Reflection.
  • Integrierte Dokumentation → Metadaten (tags, summary, produces) werden zusammen mit dem Mapping generiert.

Dieses Modell stellt sicher, dass die in Lino erstellten APIs:

  • Automatisch dokumentiert sind
  • LeistungsfĂ€hig sind
  • Mit der CQRS-Architektur des Frameworks konsistent sind
Ein unbehandelter Fehler ist aufgetreten. Aktualisieren 🗙