GraphQL在C# (.NET)中的使用:GraphQL.NET库完全指南

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

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

开始课程

C# (.NET)的GraphQL库:GraphQL.NET



GraphQL是一种现代的API查询语言,它允许客户端仅请求所需的数据,从而减少冗余并加快应用程序运行速度。对于.NET平台,有一个强大的GraphQL.NET库,它使C#开发者能够创建完全兼容GraphQL规范的服务器端。本文将详细介绍其功能、优势,并提供实际示例。



什么是GraphQL.NET?



GraphQL.NET是一个用于C# (.NET)的开源库,实现了GraphQL规范。它提供了定义模式(类型、查询、变更和订阅)、处理传入请求、验证和执行逻辑的工具。该库由社区积极维护,并已用于生产环境。



主要特点:

  • 灵活的模式定义 — 类型、接口、联合类型和枚举。
  • 支持查询(Query)、变更(Mutation)和订阅(Subscription)。
  • 与DI容器集成(例如Microsoft.Extensions.DependencyInjection)。
  • 服务器端请求验证和解析。
  • 支持DataLoader以优化N+1查询问题。
  • 测试和调试工具。


安装与配置



通过NuGet包管理器进行安装。执行以下命令:

dotnet add package GraphQLdotnet add package GraphQL.SystemTextJson


对于ASP.NET Core,还需要中间件包:

dotnet add package GraphQL.Server.Transports.AspNetCore


创建简单的GraphQL API



1. 定义数据类型



首先创建数据模型和对应的GraphQL类型:

public class Book{    public int Id { get; set; }    public string Title { get; set; }    public string Author { get; set; }}

public class BookType : ObjectType<Book>{ protected override void Configure(IObjectTypeDescriptor<Book> descriptor) { descriptor.Field(b => b.Id).Type<NonNullType<IntType>>(); descriptor.Field(b => b.Title).Type<NonNullType<StringType>>(); descriptor.Field(b => b.Author).Type<StringType>(); }}


2. 定义查询(Query)



现在创建处理查询的Query类:

public class Query{    private readonly List<Book> _books = new()    {        new Book { Id = 1, Title = "1984", Author = "George Orwell" },        new Book { Id = 2, Title = "Brave New World", Author = "Aldous Huxley" }    };

public Book GetBook(int id) { return _books.FirstOrDefault(b => b.Id == id); }

public List<Book> GetBooks() { return _books; }}


然后将此类注册到模式中:

public class BookSchema : Schema{    public BookSchema(IServiceProvider provider) : base(provider)    {        Query = provider.GetRequiredService<Query>();    }}


3. 在Startup.cs中配置



在ASP.NET Core中添加服务和中间件:

public void ConfigureServices(IServiceCollection services){    services.AddGraphQL(builder => builder        .AddSchema<BookSchema>()        .AddSystemTextJson());}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ app.UseGraphQL<BookSchema>(); app.UseGraphQLPlayground(); // 用于测试}


用于修改数据的变更(Mutation)



通过变更添加添加书籍的功能:

推荐