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
Mit der CLI von Lino einen Endpoint zu erstellen ist ganz einfach:
lino new api
Der interaktive Assistent wird Folgendes abfragen:
- Service â der Service, in dem die API erstellt werden soll.
- Modul â das Modul des Services (falls zutreffend).
- EntitĂ€t â die mit dem Endpoint verknĂŒpfte EntitĂ€t.
- API-Name â normalerweise auf das Verb der Operation abgestimmt (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 mit der EntitĂ€t Person verknĂŒpft ist, generiert die CLI automatisch:
- Endpoint mit HTTP-Mapping.
- Request/Response DTOs.
- Erweiterungen fĂŒr die Integration mit OpenAPI und Versionierung.
- Typisierter HttpClient fĂŒr die interne Nutzung durch andere Services.
Generierte Struktur:
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
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
