GraphQL в C# (.NET): библиотеки Hot Chocolate и GraphQL.NET для создания API

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 славится более современной и структурированной документацией.

Рекомендаций