GraphQL в C# (.NET): обзор библиотек и инструментов
GraphQL — это язык запросов для API, который позволяет клиентам запрашивать только те данные, которые им действительно нужны. В экосистеме C# (.NET) существует несколько мощных библиотек для реализации GraphQL-серверов и клиентов. В этой статье рассмотрим две самые популярные: Hot Chocolate и GraphQL.NET. Обе библиотеки активно развиваются, имеют открытый исходный код и отличную документацию.
1. Hot Chocolate — современный фреймворк от ChilliCream
Hot Chocolate — это полнофункциональный GraphQL-фреймворк для .NET, который поддерживает как серверную, так и клиентскую части. Он интегрируется с ASP.NET Core и Entity Framework Core, предлагая удобные атрибуты и автоматическую генерацию схемы.
Установка и базовый сервер
Для начала работы установите пакет через NuGet:
dotnet add package HotChocolate.AspNetCore
Создайте простой GraphQL-сервер:
// Определяем тип данных
public class Book
{
public string Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
// Создаем Query-класс
public class Query
{
public Book GetBook() =>
new Book
{
Id = "1",
Title = "Война и мир",
Author = "Лев Толстой"
};
}
// Настраиваем в Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>();
var app = builder.Build();
app.MapGraphQL();
app.Run();
После запуска сервер будет доступен по адресу /graphql. Вы можете отправить запрос через любой GraphQL-клиент:
{
book {
title
author
}
}
Hot Chocolate поддерживает мутации, подписки, фильтрацию, сортировку, пагинацию и интеграцию с Entity Framework через UseProjection, UseFiltering и UseSorting.
Пример с мутацией
public class Mutation
{
public Book AddBook(string title, string author) =>
new Book { Id = Guid.NewGuid().ToString(), Title = title, Author = author };
}
// Регистрация
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddMutationType<Mutation>();
2. GraphQL.NET — легковесная и проверенная временем библиотека
GraphQL.NET (известная также как graphql-dotnet) — это порт оригинальной JavaScript-реализации GraphQL на C#. Она предлагает ручное построение схемы через типы и поля, что даёт полный контроль над структурой API.
Установка и пример
dotnet add package GraphQL
dotnet add package GraphQL.SystemTextJson
dotnet add package GraphQL.Server.Transports.AspNetCore
Создадим простой сервер:
// Определяем тип
public class BookType : ObjectGraphType<Book>
{
public BookType()
{
Field(x => x.Id);
Field(x => x.Title);
Field(x => x.Author);
}
}
// Создаем схему
public class AppSchema : Schema
{
public AppSchema(IServiceProvider provider) : base(provider)
{
Query = provider.GetRequiredService<BookQuery>();
}
}
// Query
public class BookQuery : ObjectGraphType
{
public BookQuery()
{
Field<BookType>("book")
.Resolve(context => new Book
{
Id = "1",
Title = "Преступление и наказание",
Author = "Ф.М. Достоевский"
});
}
}
// Настройка Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<BookQuery>();
builder.Services.AddSingleton<AppSchema>();
builder.Services.AddGraphQL(b => b.AddSystemTextJson());
var app = builder.Build();
app.UseGraphQL<AppSchema>();
app.Run();
3. Сравнение Hot Chocolate и GraphQL.NET
- Удобство использования: Hot Chocolate предлагает более декларативный подход с атрибутами, что ускоряет разработку. GraphQL.NET требует явного определения типов и резолверов, но даёт больше гибкости.
- Производительность: Обе библиотеки имеют высокую производительность. Hot Chocolate использует компиляцию запросов в выражения, что может быть быстрее на сложных схемах.
- Экосистема: Hot Chocolate имеет встроенную поддержку подписок через WebSockets, интеграцию с Entity Framework, а также инструменты для тестирования (Banana Cake Pop). GraphQL.NET имеет больше плагинов сообщества.
- Документация: Обе библиотеки имеют подробные руководства, но Hot Chocolate славится более современной и структурированной документацией.