C# (.NET) 中的 GraphQL:Hot Chocolate 和 GraphQL.NET 库用于创建 API

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 中的 GraphQL:库与工具概述



GraphQL 是一种 API 查询语言,允许客户端只请求他们真正需要的数据。在 C# (.NET) 生态系统中,有多个强大的库可用于实现 GraphQL 服务器和客户端。本文将介绍两个最流行的库:Hot Chocolate 和 GraphQL.NET。这两个库都在积极开发中,拥有开源代码和优秀的文档。



1. Hot Chocolate — ChilliCream 的现代框架



Hot Chocolate 是一个功能完整的 .NET GraphQL 框架,同时支持服务器端和客户端。它与 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 支持变更、订阅、过滤、排序、分页,并通过 UseProjection、UseFiltering 和 UseSorting 与 Entity Framework 集成。



变更示例



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 GraphQLdotnet add package GraphQL.SystemTextJsondotnet 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>(); }}

// Querypublic class BookQuery : ObjectGraphType{ public BookQuery() { Field<BookType>("book") .Resolve(context => new Book { Id = "1", Title = "罪与罚", Author = "费·米·陀思妥耶夫斯基" }); }}

// 配置 Program.csvar builder = WebApplication.CreateBuilder(args);builder.Services.AddSingleton<BookQuery>();builder.Services.AddSingleton<AppSchema>();builder.Services.AddGraphQL(b => b.AddSystemTextJson());

var app = builder.Build();\

推荐