Einleitung: Warum GraphQL und C# ein ideales Paar sind
\nModerne Webentwicklung erfordert flexible und leistungsstarke APIs. REST-APIs leiden trotz ihrer Beliebtheit oft unter Over-Fetching (Abruf unnötiger Daten) und Under-Fetching (Notwendigkeit mehrerer Anfragen, um vollständige Informationen zu erhalten). GraphQL löst diese Probleme, indem es dem Client ermöglicht, nur das anzufragen, was er benötigt, und zwar in einer einzigen Anfrage.
\nIn diesem Tutorial erstellen wir eine vollwertige GraphQL-API mit C# unter Verwendung der Bibliothek Hot Chocolate – der beliebtesten GraphQL-Implementierung für .NET. Sie erfahren, wie Sie einen Server einrichten, ein Schema definieren, Abfragen (Queries), Mutationen (Mutations) und Subscriptions (Subscriptions) implementieren. Alle Codebeispiele sind praxisnah und einsatzbereit.
\nFür wen ist dieses Material geeignet: für .NET-Entwickler, die GraphQL erlernen möchten, und für alle, die nach einer Alternative zu REST suchen. Grundkenntnisse in C# und ASP.NET Core sind hilfreich, aber nicht zwingend erforderlich.
\n\n1. Projekteinrichtung und Installation von Hot Chocolate
\nErstellen eines ASP.NET Core-Projekts
\nBeginnen wir mit der Erstellung eines neuen Projekts. Öffnen Sie ein Terminal oder eine Eingabeaufforderung und führen Sie Folgendes aus:
\ndotnet new web -n GraphQLDemo\ncd GraphQLDemo\nInstallieren Sie nun das Paket Hot Chocolate:
\ndotnet add package HotChocolate.AspNetCore\ndotnet add package HotChocolate.AspNetCore.Playground\nDas Paket HotChocolate.AspNetCore fügt Middleware zur Verarbeitung von GraphQL-Anfragen hinzu, und HotChocolate.AspNetCore.Playground bietet eine integrierte IDE (GraphQL Playground) zum Testen.
Startup-Konfiguration
\nBearbeiten Sie die Datei Program.cs (oder Startup.cs für .NET 5 und niedriger). Fügen wir eine grundlegende Konfiguration hinzu:
var builder = WebApplication.CreateBuilder(args);\n\n// GraphQL-Dienste hinzufügen\nbuilder.Services\n .AddGraphQLServer()\n .AddQueryType<Query>()\n .AddMutationType<Mutation>(); // fügen wir später hinzu\n\nvar app = builder.Build();\n\n// Middleware hinzufügen\napp.UseRouting();\napp.MapGraphQL(); // Endpunkt /graphql\napp.MapGraphQLPlayground(); // Playground verfügbar unter /playground\n\napp.Run();\nBeachten Sie: Query und Mutation sind Klassen, die wir später erstellen werden. Lassen wir vorerst nur Query übrig.
2. Erstellung des Datenmodells und der ersten Abfrage (Query)
\nModell Book
\nErstellen wir ein einfaches Buchmodell. Fügen Sie die Datei Models/Book.cs hinzu:
namespace GraphQLDemo.Models;\n\npublic class Book\n{\n public int Id { get; set; }\n public string Title { get; set; } = string.Empty;\n public string Author { get; set; } = string.Empty;\n public int Year { get; set; }\n public decimal Price { get; set; }\n}\n\nKlasse Query
\nErstellen wir nun die Klasse Query, die Methoden zum Abrufen von Daten enthält. Fügen Sie die Datei GraphQL/Query.cs hinzu:
using GraphQLDemo.Models;\n\nnamespace GraphQLDemo.GraphQL;\n\npublic class Query\n{\n // Temporärer Datenspeicher (in einem echten Projekt: Datenbank)\n private static readonly List<Book> Books = new()\n {\n new Book { Id = 1, Title = "Krieg und Frieden", Author = "Leo Tolstoi", Year = 1869, Price = 29.99m },\n new Book { Id = 2, Title = "Verbrechen und Strafe", Author = "Fjodor Dostojewski", Year = 1866, Price = 24.99m },\n new Book { Id = 3, Title = "Der Meister und Margarita", Author = "Michail Bulgakow", Year = 1967, Price = 19.99m }\n };\n\n // Abfrage: alle Bücher abrufen\n public IQueryable<Book> GetBooks() => Books.AsQueryable();\n\n // Abfrage: ein Buch nach ID abrufen\n public Book? GetBookById(int id) => Books.FirstOrDefault(b => b.Id == id);\n}\nMethoden, die Daten zurückgeben, werden als Resolver bezeichnet. Hot Chocolate automatisch