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
