Easy-DotNET Easy-DotNET
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
npm
  • 简介
  • ORM

    • EFCore
    • Dapper
    • FreeSql
    • SqlSugar
  • 任务调度

    • Hangfire
    • Quartz
    • FluentScheduler
    • Coravel
    • Quartzmin
  • 日志

    • Serilog
    • NLog
    • Log4Net
    • Stackdriver
    • ExceptionLess
  • 身份认证与授权

    • IdentityServer4
    • Identity
    • JWTBearer
    • Auth0
    • OpenIddict
  • Swagger文档

    • Swagger
    • Swashbuckle
    • NSwag
    • ReDoc
  • 对象映射

    • AutoMapper
    • EmitMapper
    • AgileMapper
    • Mapster
  • 消息传递

    • MediatR
    • MassTransit
    • Rebus
    • NServiceBus
  • 熔断重试限流

    • Polly
    • Resilience4j
    • AkkaNET
  • 缓存

    • CsRedis
    • FreeRedis
    • EasyCaching
    • StackExchangeRedis
    • CacheCow
    • NCache
    • Memory
  • 注册发现

    • Consul
    • Nacos
    • Apollo
  • 网关

    • Ocelot
    • Kong
    • Traefik
    • Zuul
  • GraphQL

    • GraphQLPlatform
    • GraphQLdotnet
      • 1. 安装GraphQL-DotNet
      • 2. 创建GraphQL Schema
      • 3. 使用GraphQL-DotNet处理HTTP请求
      • 4. 编写GraphQL查询
      • 5. 添加GraphQL可变更
      • 6. 添加GraphQL订阅
      • 7. 结论
  • 更多

    • NodaTime
    • FluentAssertions
    • Humanizer
    • 爬虫-AngleSharp
    • 邮件-MailKit
  • NET微服务
  • GraphQL
一个大西瓜
2023-04-25
目录

GraphQLdotnet

开源地址

Github:https://github.com/graphql-dotnet/graphql-dotnet (opens new window)

GraphQL是一种用于API的查询语言,它可以让客户端指定需要的数据而不会导致过度获取数据的情况。GraphQL可以与各种后端技术一起使用,包括.NET。GraphQL-DotNet是一个.NET库,它使创建GraphQL服务器和客户端变得简单易行。在本文中,我们将探讨如何在.NET中使用GraphQL-DotNet。

# 1. 安装GraphQL-DotNet

GraphQL-DotNet可以通过NuGet安装。可以在Visual Studio中使用NuGet包管理器,也可以使用命令行工具安装它。在Visual Studio中安装GraphQL-DotNet,可以在“NuGet包管理器控制台”中运行以下命令:


Install-Package GraphQL
Install-Package GraphQL.Server.Transports.AspNetCore

# 2. 创建GraphQL Schema

GraphQL-DotNet需要一个GraphQL Schema来定义可查询和可变更的数据模型。这个模型由类型定义和函数定义组成。以下是一个简单的示例模式:


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

public class Query
{
    private List<Book> _books = new List<Book>
    {
        new Book { Id = 1, Title = "The C Programming Language", Author = "Brian W. Kernighan, Dennis M. Ritchie" },
        new Book { Id = 2, Title = "The Pragmatic Programmer", Author = "Andrew Hunt, David Thomas" },
        new Book { Id = 3, Title = "Clean Code: A Handbook of Agile Software Craftsmanship", Author = "Robert C. Martin" }
    };

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

public class GraphQLSchema : Schema
{
    public GraphQLSchema(IDependencyResolver resolver) : base(resolver)
    {
        Query = resolver.Resolve<Query>();
    }
}

在上面的示例中,我们定义了一个Book类型和一个查询类型Query。Query类型具有一个GetBooks函数,该函数返回Book列表。GraphQLSchema类是一个继承自Schema类的类,用于定义查询类型和可变更类型。

# 3. 使用GraphQL-DotNet处理HTTP请求

GraphQL-DotNet可以处理HTTP请求。以下是在.NET Core中使用GraphQL-DotNet的示例代码:


public void ConfigureServices(IServiceCollection services)
{
    services.AddGraphQL(options =>
    {
        options.EnableMetrics = true;
        options.ExposeExceptions = true;
    })
    .AddSystemTextJson()
    .AddDataLoader()
    .AddGraphTypes(typeof(GraphQLSchema));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseGraphQL<GraphQLSchema>();
}

在上面的示例中,我们将GraphQL配置添加到服务集合中,并指定了要使用的JSON序列化程序、数据加载程序和GraphQL模式。在Configure方法中,我们使用了GraphQL中间件来处理GraphQL请求。

# 4. 编写GraphQL查询

现在,我们已经准备好使用GraphQL查询数据。GraphQL-DotNet提供了一个用于查询的特殊语言,称为GraphQL查询语言。以下是一个查询示例:


{
    books {
        id
        title
        author
    }
}

在这个查询中,我们请求所有书籍的ID、标题和作者。要执行此查询,我们可以使用以下代码:


var schema = new GraphQLSchema(new FuncDependencyResolver(type => Activator.CreateInstance(type)));
var query = "{ books { id title author } }";
var result = await new DocumentExecuter().ExecuteAsync(_ =>
{
    _.Schema = schema;
    _.Query = query;
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true).Write(result);

在上面的代码中,我们首先创建一个GraphQLSchema实例。然后,我们定义一个查询字符串并使用DocumentExecuter来执行查询。最后,我们使用DocumentWriter将结果写成JSON字符串。

# 5. 添加GraphQL可变更

GraphQL-DotNet还支持GraphQL可变更,这是一种允许客户端修改数据的机制。以下是一个可变更示例:


mutation {
    addBook(title: "The Clean Coder: A Code of Conduct for Professional Programmers", author: "Robert C. Martin") {
        id
        title
        author
    }
}

在上面的可变更中,我们请求将一本新书添加到列表中。要实现此可变更,我们需要定义一个可变更类型和一个可变更函数。以下是一个示例:


public class Mutation
{
    private List<Book> _books = new List<Book>
    {
        new Book { Id = 1, Title = "The C Programming Language", Author = "Brian W. Kernighan, Dennis M. Ritchie" },
        new Book { Id = 2, Title = "The Pragmatic Programmer", Author = "Andrew Hunt, David Thomas" },
        new Book { Id = 3, Title = "Clean Code: A Handbook of Agile Software Craftsmanship", Author = "Robert C. Martin" }
    };

    public Book AddBook(string title, string author)
    {
        var book = new Book { Id = _books.Count + 1, Title = title, Author = author };
        _books.Add(book);
        return book;
    }
}

public class GraphQLSchema : Schema
{
    public GraphQLSchema(IDependencyResolver resolver) : base(resolver)
    {
        Query = resolver.Resolve<Query>();
        Mutation = resolver.Resolve<Mutation>();
    }
}

在上面的示例中,我们定义了一个Mutation类型和一个AddBook函数。AddBook函数将创建一本新书,并将其添加到_books列表中。我们还在GraphQLSchema类中定义了Mutation类型。

要执行上面的可变更,我们可以使用以下代码:


var schema = new GraphQLSchema(new FuncDependencyResolver(type => Activator.CreateInstance(type)));
var query = "mutation { addBook(title: \"The Clean Coder: A Code of Conduct for Professional Programmers\", author: \"Robert C. Martin\") { id title author } }";
var result = await new DocumentExecuter().ExecuteAsync(_ =>
{
    _.Schema = schema;
    _.Query = query;
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true).Write(result);

在上面的代码中,我们首先创建一个GraphQLSchema实例。然后,我们定义一个可变更字符串并使用DocumentExecuter来执行可变更。最后,我们使用DocumentWriter将结果写成JSON字符串。

# 6. 添加GraphQL订阅

GraphQL-DotNet还支持GraphQL订阅,这是一种允许客户端订阅实时数据的机制。以下是一个订阅示例:


subscription {
    bookAdded {
        id
        title
        author
    }
}

在上面的订阅中,我们请求实时接收新书的ID、标题和作者。要实现此订阅,我们需要定义一个订阅类型和一个订阅函数。以下是一个示例:


public class Subscription
{
    private IObservable<Book> _bookStream;

    public Subscription(IObservable<Book> bookStream)
    {
        _bookStream = bookStream;
    }

    public IObservable<Book> BookAdded()
    {
        return _bookStream;
    }
}

public class GraphQLSchema : Schema
{
    public GraphQLSchema(IDependencyResolver resolver) : base(resolver)
    {
        Query = resolver.Resolve<Query>();
        Mutation = resolver.Resolve<Mutation>();
        Subscription = resolver.Resolve<Subscription>();
    }
}

在上面的示例中,我们定义了一个Subscription类型和一个BookAdded函数。BookAdded函数返回一个IObservable<Book>对象,该对象代表实时的书籍数据流。我们还在GraphQLSchema类中定义了Subscription类型。

要执行上面的订阅,我们可以使用以下代码:


var bookStream = Observable.Interval(TimeSpan.FromSeconds(1)).Select(_ => new Book { Id = (int)_ + 1, Title = "New Book", Author = "Unknown" });
var schema = new GraphQLSchema(new FuncDependencyResolver(type => Activator.CreateInstance(type)), bookStream);
var query = "subscription { bookAdded { id title author } }";
var result = await new DocumentExecuter().ExecuteAsync(_ =>
{
    _.Schema = schema;
    _.Query = query;
    _.OperationName = "bookAdded";
    _.Inputs = new Inputs();
    _.UserContext = new Dictionary<string, object>();
    _.CancellationToken = default;
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true).Write(result);

在上面的代码中,我们首先创建一个实时数据流。然后,我们创建一个GraphQLSchema实例,并将实时数据流传递给Subscription构造函数。接下来,我们定义了一个订阅字符串,并使用DocumentExecuter来执行订阅。注意,我们需要设置OperationName为“bookAdded”,以便GraphQL-DotNet知道我们要订阅哪个函数。

# 7. 结论

在本文中,我们介绍了如何在.NET中使用GraphQL-DotNet。我们首先安装了GraphQL-DotNet,并创建了一个GraphQL Schema来定义数据模型。然后,我们演示了如何使用GraphQL-DotNet处理HTTP请求、编写GraphQL查询、添加GraphQL可变更和添加GraphQL订阅。通过学习本文,您应该已经掌握了如何使用GraphQL-DotNet在.NET中创建灵活的API。

上次更新: 2023/04/26, 22:10:06
GraphQLPlatform
NodaTime

← GraphQLPlatform NodaTime→

Theme by Vdoing | Copyright © 2019-2024 一个大西瓜 | MIT License | 苏ICP备2023013501号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式