跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

.NET Core 使用 GraphQL.Server 在 Azure Functions 中实现依赖注入

GraphQL 是一种用于 API 的查询语言和运行时环境,旨在解决 RESTful API 的数据获取限制。其核心理念是客户端定义所需数据结构,服务器返回匹配数据,适用于前后端分离及大型 API 架构。相比 RESTful,GraphQL 支持单次请求获取多个资源,避免过度获取或不足获取,但需自行管理缓存。在 .NET Core Azure Functions 环境中,可通过 FunctionsStartup 类注册 GraphQL 服务,利用依赖注入管理生命周期,并通过 HTTP 触发器暴露 GraphQL 端点及 Playground 界面,实现灵活的数据交互。

JavaCoder发布于 2025/2/5更新于 2026/10/24100 浏览
.NET Core 使用 GraphQL.Server 在 Azure Functions 中实现依赖注入

GraphQL 基础

GraphQL 概念

GraphQL 是一种用于 API 的查询语言和运行时环境。它是由 Facebook 于 2012 年开始内部使用,2015 年对外宣布开源。GraphQL 旨在解决 RESTful API 的一些限制,如需要多次请求才能获取完整数据、难以扩展、无法精确控制数据返回等。

GraphQL 的核心理念是:客户端定义数据需要的结构及其关系,服务器返回与此结构相匹配的数据。因此,GraphQL 非常适用于前后端分离的应用,客户端可以精确地控制数据返回,提高了 API 的可靠性和灵活性。

应用场景

GraphQL 具体应用场景如下:

  • 前后端分离的应用
  • 移动应用后端 API
  • 多语言(多平台)支持的 API
  • 大型 API 架构

GraphQL 的详细使用过程如下:

  1. 定义 Schema:Schema 定义了所有可用的查询、关系和数据类型,可以理解为 GraphQL 的 API 文档。
  2. 定义 Resolver:Resolver 是用来实际获取数据的代码,根据 Schema 中的查询字段获取实际数据。
  3. 编写查询:根据需要编写查询,查询可以包含多个字段和参数,并且可以进行嵌套。
  4. 发送查询:使用 GraphQL 客户端发送查询请求,返回与查询匹配的数据。
  5. 处理错误:错误处理是 GraphQL 重要的一个方面,通过使用错误处理器和异常捕获来管理错误。

GraphQL 是一种强大而灵活的 API 开发工具,通过其独特的查询语言和运行时环境,可以大大提高 API 的可用性和灵活性,是 API 开发的一种重要的选择。

与 RESTful 对比

RESTful API 和 GraphQL 都是用于构建 Web API 的工具,但它们有一些不同的特点。

数据获取方式

RESTful API 是基于 HTTP 的协议,使用 HTTP 动词(GET、POST、PUT、DELETE 等)来获取或修改数据。每个资源都有一个唯一的 URI,每个动词都对应一个特定的操作。RESTful API 的响应是基于请求中的 URI 和动词的,不能跨越这些边界。

GraphQL 使用单个端点来获取和修改数据,使用查询语言来指定所需的数据。GraphQL 允许客户端请求精确的数据,而不是只返回整个资源。

查询效率

RESTful API 有一个缺点,就是当需要获取多个资源时,需要进行多个 HTTP 请求。这种'资源瀑布'的方式会导致多个请求的延迟和带宽消耗,限制了应用程序的性能。

GraphQL 允许在一个请求中获取多个资源,并且可以指定所需的字段和关系,避免了不必要的数据传输,更加高效。

缓存和版本控制

RESTful API 通常使用 HTTP 标准的缓存机制(例如,使用 Last-Modified 和 ETag 头),以减少带宽和服务器负载。RESTful API 也支持版本控制,可以更好地管理 API 的变化。

GraphQL 没有内置的缓存机制,但可以使用其他缓存机制(例如,HTTP 缓存)来缓存 GraphQL 查询。版本控制通常由客户端管理,GraphQL 会返回错误,告知客户端如何修正查询。

开发效率

RESTful API 和 GraphQL 各自有其优势,RESTful API 更容易理解和学习,而 GraphQL 更加灵活。

GraphQL 在数据获取方面更加强大和灵活,能够更好地适应复杂的数据需求。然而,由于 GraphQL 的语法较为复杂,开发人员需要更多的学习和编写时间。并且,GraphQL 还需要一个运行时,并且需要进行更严格的代码检查,使其更难以使用。

API 的可发现性

RESTful API 的资源 URI 的结构能够传达出 API 的基本结构。每个资源都必须在 API 文档中进行描述。

GraphQL 没有 URI 能够传达出 API 的结构,API 的可发现性需要通过不同的方式进行实现。例如,开发人员需要提供一个文档来描述所有可用的查询和变异操作。

RESTful API 和 GraphQL 各有优劣。选择哪种 API 取决于项目的需求。如果需要简单和可靠的 API,RESTful API 是一个不错的选择;如果需要快速、灵活、精确的数据获取方式,GraphQL 则是一个更好的选择。

基本语法

GraphQL 是一种查询语言,用于 API 的编写和操作。以下是 GraphQL 的基本语法:

查询

使用关键字'query'来声明查询类型,后面跟上查询的字段和参数。例如:

query {
  person(id: "1") {
    name
    age
  }
}
变量

使用$符号来声明变量,可以在查询中重用变量。

例如:

query getPerson($id: ID!) {
  person(id: $id) {
    name
    age
  }
}

在执行时,需要提供变量的值。例如:

{
  "id": "1"
}
片段

可以在查询中使用片段来重用查询部分。片段以'…'开头,后面跟上片段名称。

例如:

query {
  person(id: "1") {
    name
    age
    address {
      ...addressFields
    }
  }
}

fragment addressFields on Address {
  street
  city
  state
}
操作名称

可以使用操作名称来标识查询,方便调试和追踪。操作名称在关键字'query'或'mutation'之后的花括号之间定义。

例如:

query getPerson($id: ID!) {
  person(id: $id) {
    name
    age
  }
}
变更

使用关键字'mutation'来声明变更操作。变更可以用来进行数据的修改和创建。

例如:

mutation {
  createPerson(name: "Sam", age: 25) {
    id
    name
    age
  }
}

以上是 GraphQL 的基本语法,还有更多高级特性和语法详情可以参考 GraphQL 官方文档。

Azure Functions 集成

创建项目

新建一个 Azure Functions 项目。

安装依赖

安装以下 NuGet 包:

Microsoft.NET.Sdk.Functions
Microsoft.Azure.Functions.Extensions

注册服务

要注册服务,我们需要创建一个 FunctionStartup 类,就像我们在一个常见的 ASP.NET Core 应用程序中一样。

在应用程序的根目录下创建一个名为 FunctionStartup.cs 的文件。

using GraphQL;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Chat = GraphQL.Samples.Schemas.Chat;

[assembly: FunctionsStartup(typeof(Samples.AzureFunctions.Startup))]
namespace Samples.AzureFunctions;

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton<Chat.IChat, Chat.Chat>();

        builder.Services.AddGraphQL(b => b
            .AddAutoSchema<Chat.Query>()
            .AddSystemTextJson());
    }
}

使用服务

打开你的函数文件进行以下更改:从类和函数中删除 static 标记(我们需要使用构造函数注入),创建构造函数并注入依赖接口。

using GraphQL.Server.Transports.AspNetCore;
using GraphQL.Server.Ui.Playground;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace Samples.AzureFunctions;

public class GraphQL
{
    [FunctionName("GraphQL")]
    public IActionResult RunGraphQL(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest request,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a GraphQL request.");

        return new GraphQLExecutionActionResult();
    }

    [FunctionName("Playground")]
    public IActionResult RunPlayground(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest request,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request for the GraphQL Playground UI.");

        return new PlaygroundActionResult(opts => opts.GraphQLEndPoint = "/api/graphql"); // /api/graphql route will call RunGraphQL method
    }
}

运行

启动项目并访问相应端点进行验证。

目录

  1. GraphQL 基础
  2. GraphQL 概念
  3. 应用场景
  4. 与 RESTful 对比
  5. 数据获取方式
  6. 查询效率
  7. 缓存和版本控制
  8. 开发效率
  9. API 的可发现性
  10. 基本语法
  11. 查询
  12. 变量
  13. 片段
  14. 操作名称
  15. 变更
  16. Azure Functions 集成
  17. 创建项目
  18. 安装依赖
  19. 注册服务
  20. 使用服务
  21. 运行

更多推荐文章

查看全部
  • PPO算法在四足机器人上的实现:rsl_rl代码解读
  • Buzz:基于 Whisper 的离线语音转写工具
  • Altera USB-Blaster 驱动安装与 FPGA 下载调试指南
  • Stable Diffusion 提示词高阶用法实战指南
  • DeepSeek-V3 技术报告详解:架构、训练与评估核心分析
  • Gemini QQ 机器人部署指南 (NapCat + NoneBot2)
  • 智慧养老手表管理系统前端样式层功能说明
  • 无显卡如何运行 AI 绘画?Stable Diffusion 云端镜像部署指南
  • Embedding 模型的选择和微调
  • CTFShow Web 命令执行 29-124 实战解析
  • 核心期刊与 SCI 投稿 AIGC 检测应对策略
  • Stable Diffusion 秋叶整合包快速上手指南
  • LVGL 嵌入式 GUI 开发指南:轻量高效开源方案
  • OpenClaw 本地 AI 助手安装、配置与钉钉接入指南
  • Figma Make 实测:AI 辅助前端开发的可行性分析
  • MySQL 从零开始:基础概念与 Ubuntu 安装指南
  • Windows 本地部署 OpenClaw 接入飞书机器人
  • Java 开发者常用的 Linux 系统指令速查
  • DeepSeek R1 个人 AI 知识库搭建指南(API 与本地部署)
  • Whisper.cpp 量化模型清单及 ggml 格式下载指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online