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();\