GraphQL在.NET 8中的全面實踐指南

一、GraphQL與.NET 8概述

GraphQL是一種由Facebook開發的API查詢語言,它提供了一種更高效、更靈活的替代REST的方案。與REST不同,GraphQL允許客戶端精確指定需要的數據結構和字段,避免了"過度獲取"或"不足獲取"的問題。

.NET 8對GraphQL的支持

.NET 8帶來了多項性能改進和新特性,使其成為構建GraphQL服務的理想平臺:

  • 性能提升:AOT編譯、改進的JIT編譯器
  • 最小API增強:簡化GraphQL端點設置
  • 原生AOT支持:適合云原生GraphQL服務部署
  • 改進的依賴注入:更簡潔的服務注冊方式

二、環境準備與項目搭建

1. 創建.NET 8項目

dotnet new web -n GraphQLDemo
cd GraphQLDemo

2. 添加必要的NuGet包

dotnet add package HotChocolate.AspNetCore
dotnet add package HotChocolate.Data
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

三、基礎GraphQL服務搭建

1. 定義數據模型

// Models/Book.cs
public class Book
{public int Id { get; set; }public string Title { get; set; }public Author Author { get; set; }public DateTime PublishedDate { get; set; }
}// Models/Author.cs
public class Author
{public int Id { get; set; }public string Name { get; set; }public ICollection<Book> Books { get; set; } = new List<Book>();
}

2. 配置DbContext

// Data/AppDbContext.cs
public class AppDbContext : DbContext
{public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }public DbSet<Book> Books { get; set; }public DbSet<Author> Authors { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Author>().HasMany(a => a.Books).WithOne(b => b.Author).HasForeignKey(b => b.AuthorId);}
}

3. 注冊GraphQL服務

// Program.cs
var builder = WebApplication.CreateBuilder(args);// 添加DbContext
builder.Services.AddDbContext<AppDbContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));// 添加GraphQL服務
builder.Services.AddGraphQLServer().AddQueryType<Query>().AddMutationType<Mutation>().AddProjections().AddFiltering().AddSorting();var app = builder.Build();app.MapGraphQL(); // 默認路徑為/graphqlapp.Run();

四、查詢(Query)實現

1. 基本查詢類型

// GraphQL/Query.cs
public class Query
{[UseDbContext(typeof(AppDbContext))][UseProjection][UseFiltering][UseSorting]public IQueryable<Book> GetBooks([ScopedService] AppDbContext context) => context.Books;[UseDbContext(typeof(AppDbContext))]public async Task<Book?> GetBookById([ScopedService] AppDbContext context,int id) => await context.Books.FindAsync(id);
}

2. 復雜查詢示例

query {books(where: { title: { contains: "NET" } }, order: { publishedDate: DESC }) {titlepublishedDateauthor {name}}
}

五、變更(Mutation)實現

1. 基本變更操作

// GraphQL/Mutation.cs
public class Mutation
{[UseDbContext(typeof(AppDbContext))]public async Task<AddBookPayload> AddBook(AddBookInput input,[ScopedService] AppDbContext context){var book = new Book{Title = input.Title,PublishedDate = input.PublishedDate,AuthorId = input.AuthorId};context.Books.Add(book);await context.SaveChangesAsync();return new AddBookPayload(book);}
}public record AddBookInput(string Title, DateTime PublishedDate, int AuthorId);public record AddBookPayload(Book Book);

2. 輸入類型與Payload模式

mutation {addBook(input: {title: "Mastering GraphQL in .NET 8",publishedDate: "2023-11-01",authorId: 1}) {book {idtitle}}
}

六、高級特性實現

1. 數據加載器(DataLoader)優化

// GraphQL/Query.cs
public async Task<IEnumerable<Author>> GetAuthorsWithBooks([Service] AppDbContext context,[Service] IResolverContext resolverContext)
{var loader = resolverContext.BatchDataLoader<int, Author>("authorsById",async (ids, ct) =>{var authors = await context.Authors.Where(a => ids.Contains(a.Id)).ToDictionaryAsync(a => a.Id, ct);return ids.Select(id => authors.TryGetValue(id, out var author) ? author : null);});// 假設我們有一些作者IDvar authorIds = new[] { 1, 2, 3 };return await loader.LoadAsync(authorIds);
}

2. 訂閱(Subscription)實現

// GraphQL/Subscription.cs
[ExtendObjectType("Subscription")]
public class BookSubscriptions
{[Subscribe][Topic("BookAdded")]public Book OnBookAdded([EventMessage] Book book) => book;
}// 在Mutation中發布事件
[UseDbContext(typeof(AppDbContext))]
public async Task<AddBookPayload> AddBook(AddBookInput input,[ScopedService] AppDbContext context,[Service] ITopicEventSender eventSender)
{var book = new Book { /* ... */ };context.Books.Add(book);await context.SaveChangesAsync();await eventSender.SendAsync("BookAdded", book);return new AddBookPayload(book);
}

七、性能優化與安全

1. 查詢復雜度分析

builder.Services.AddGraphQLServer().AddQueryType<Query>().AddMutationType<Mutation>().AddMaxExecutionDepthRule(5) // 限制查詢深度.AddQueryCostOptions(options =>{options.DefaultCost = 1;options.MaxAllowedCost = 1000;});

2. 認證與授權

// 添加認證服務
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { /* 配置JWT */ });// 保護GraphQL端點
builder.Services.AddGraphQLServer().AddAuthorization().AddHttpRequestInterceptor<AuthInterceptor>();// 實現攔截器
public class AuthInterceptor : DefaultHttpRequestInterceptor
{public override ValueTask OnCreateAsync(HttpContext context,IRequestExecutor requestExecutor,IQueryRequestBuilder requestBuilder,CancellationToken cancellationToken){if (!context.User.Identity.IsAuthenticated){throw new GraphQLException("未認證用戶");}return base.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken);}
}

八、.NET 8特有優化

1. AOT編譯支持

<PropertyGroup><PublishAot>true</PublishAot>
</PropertyGroup>

2. 最小API集成

app.MapGraphQL().WithTags("GraphQL").WithDescription("GraphQL API端點").RequireAuthorization();

3. 性能監控

builder.Services.AddGraphQLServer().AddInstrumentation(options =>{options.RequestDetails = RequestDetails.All;options.IncludeDocument = true;}).AddDiagnosticEventListener<PerformanceLogger>();public class PerformanceLogger : DiagnosticEventListener
{public override void RequestProcessing(HttpContext context, IRequestExecutor executor, IQueryRequest request){var stopwatch = Stopwatch.StartNew();base.RequestProcessing(context, executor, request);stopwatch.Stop();Console.WriteLine($"請求處理時間: {stopwatch.ElapsedMilliseconds}ms");}
}

九、測試GraphQL API

1. 使用Banana Cake Pop

HotChocolate內置了Banana Cake Pop這個GraphQL IDE,訪問/graphql即可使用。

2. 單元測試示例

[TestClass]
public class GraphQLTests
{[TestMethod]public async Task GetBooks_ReturnsValidData(){// 安排var executor = await new ServiceCollection().AddGraphQLServer().AddQueryType<Query>().AddDbContext<AppDbContext>(options => options.UseInMemoryDatabase("TestDB")).BuildRequestExecutorAsync();// 執行var result = await executor.ExecuteAsync(@"query {books {titleauthor {name}}}");// 斷言Assert.IsFalse(result.Errors?.Any() ?? false);var books = result.ToJson();Assert.IsNotNull(books);}
}

十、部署與擴展

1. 容器化部署

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app /p:PublishAot=trueFROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["./GraphQLDemo"]

2. 擴展架構建議

  • 聯邦架構:使用HotChocolate Federation擴展
  • 緩存策略:實現查詢緩存中間件
  • 限流:添加請求限流保護

結語

.NET 8為構建高性能GraphQL服務提供了堅實的基礎,結合HotChocolate這樣的成熟庫,開發者可以快速構建靈活、高效的API服務。本文涵蓋了從基礎到高級的各個方面,希望能幫助您在.NET生態中充分利用GraphQL的優勢。

實際項目中,建議根據具體需求選擇合適的GraphQL特性,平衡靈活性與性能,并始終關注API的安全性和可維護性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906567.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906567.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elasticsearch 寫入性能優化有哪些常見手段?

Elasticsearch 寫入性能優化常見手段主要有以下 10 個方向&#xff0c;建議根據具體業務場景組合使用&#xff1a; 批量寫入優化 使用_bulk API 批量提交文檔建議每批次 5-15MB 數據量并發執行多個批量請求 索引配置調優 PUT /my_index {"settings": {"inde…

【圖像大模型】基于深度對抗網絡的圖像超分辨率重建技術ESRGAN深度解析

基于深度對抗網絡的圖像超分辨率重建技術ESRGAN深度解析 一、技術背景與核心創新1.1 圖像超分辨率技術演進1.2 核心技術創新對比 二、算法原理深度解析2.1 網絡架構設計2.1.1 RRDB模塊結構 2.2 損失函數設計2.2.1 對抗損失&#xff08;Adversarial Loss&#xff09;2.2.2 感知損…

第八天 搭建車輛狀態監控平臺(Docker+Kubernetes) OTA升級服務開發(差分升級、回滾機制)

前言 在智能網聯汽車快速發展的今天&#xff0c;車輛狀態監控和OTA&#xff08;Over-The-Air&#xff09;升級已成為智能汽車的核心能力。本文將手把手帶你從零開始搭建基于云原生技術的車輛狀態監控平臺&#xff0c;并開發完整的OTA升級服務系統。無論你是剛接觸容器技術的開…

五分鐘學會如何封裝Jsckson工具類

前言&#xff1a;在 Java 開發中&#xff0c;JSON 是一種非常常見的數據格式&#xff0c;而 Jackson 是處理 JSON 的主流庫之一&#xff0c;為了提高代碼的復用性、可維護性&#xff0c;我們通常會將 Jackson 的操作封裝成一個工具類&#xff0c;簡化使用。 ???這里是秋刀魚…

InternLM 論文分類微調實踐(XTuner 版)

1.環境安裝 我創建開發機選擇鏡像為Cuda12.2-conda&#xff0c;選擇GPU為100%A100的資源配置 Conda 管理環境 conda create -n xtuner_101 python3.10 -y conda activate xtuner_101 pip install torch2.4.0cu121 torchvision torchaudio --extra-index-url https://downloa…

軟考中級軟件設計師——設計模式篇

一、設計模式核心分類 設計模式分為 3 大類&#xff0c;共 23 種模式&#xff08;考試常考約 10-15 種&#xff09;&#xff1a; 分類核心模式考試重點創建型模式工廠方法、抽象工廠、單例、生成器、原型單例模式的實現&#xff08;懶漢、餓漢&#xff09;、工廠模式的應用場…

小米2025年校招筆試真題手撕(一)

一、題目 小A每天都要吃a,b兩種面包各一個。而他有n個不同的面包機&#xff0c;不同面包機制作面包的時間各不相同。第i臺面包機制作a面包 需要花費ai的時間&#xff0c;制作b面包則需要花費bi的時間。 為能盡快吃到這兩種面包&#xff0c;小A可以選擇兩個不同的面包機x&…

【微信小程序 + 高德地圖API 】鍵入關鍵字搜索地址,獲取經緯度等

前言 又到熟悉的前言&#xff0c;接到個需求&#xff0c;要引入高德地圖api&#xff0c;我就記錄一下&#xff0c;要是有幫助記得點贊、收藏、關注&#x1f601;。 后續有時間會慢慢完善一些文章&#xff1a;&#xff08;畫餅時間&#xff09; map組件自定義氣泡、mark標記點…

uni-app(2):頁面

1 頁面簡介 uni-app項目中&#xff0c;一個頁面就是一個符合Vue SFC規范的 vue 文件。 在 uni-app js 引擎版中&#xff0c;后綴名是.vue文件或.nvue文件。 這些頁面均全平臺支持&#xff0c;差異在于當 uni-app 發行到App平臺時&#xff0c;.vue文件會使用webview進行渲染&…

Axure實戰:智慧水務管理系統原型設計速覽

本原型通過Axure構建覆蓋生產到服務的全流程交互模型&#xff0c;聚焦"數據驅動智能決策"核心價值&#xff0c;助力水務企業實現管理效率提升與運營成本優化。 系統采用"13N"架構&#xff1a; 1個統一入口&#xff1a;集成單點登錄與角色動態權限&#xff…

十二、Linux實現截屏小工具

系列文章目錄 本系列文章記錄在Linux操作系統下&#xff0c;如何在不依賴QT、GTK等開源GUI庫的情況下&#xff0c;基于x11窗口系統&#xff08;xlib&#xff09;圖形界面應用程序開發。之所以使用x11進行窗口開發&#xff0c;是在開發一個基于duilib跨平臺的界面庫項目&#x…

藍橋杯分享經驗

系列文章目錄 提示&#xff1a;小白先看系列 第一章 藍橋杯的錢白給嗎 文章目錄 系列文章目錄前言一、自我介紹二、經驗講解:1.基礎知識2.進階知識3.個人觀點 三、總結四、后續 前言 第十六屆藍橋杯已經省賽已經結束了&#xff0c;相信很多小伙伴也已經得到自己的成績了。接下…

XC3588H搭載國產麒麟系統可用于政務/社保一體機嗎?

答案是肯定的。 向成電子XC3588H搭載的國產銀河麒麟系統和國產星光麒麟系統已完成適配&#xff0c;適用于政務服務、社保服務一體機的所有外設&#xff0c;運行穩定流暢。 在數字化政務快速發展的今天&#xff0c;政務服務終端的穩定性、安全性與高效性成為提升群眾辦事體驗的關…

如何排查服務器 CPU 溫度過高的問題并解決?

服務器CPU溫度過高是一個常見的問題&#xff0c;可能導致服務器性能下降、系統穩定性問題甚至硬件損壞。有效排查和解決服務器CPU溫度過高的問題對于確保服務器正常運行和延長硬件壽命至關重要。本文將介紹如何排查服務器CPU溫度過高的問題&#xff0c;并提供解決方法&#xff…

物聯網、云計算技術加持,助推樓宇自控系統實現智能高效管理

在建筑智能化發展的進程中&#xff0c;樓宇自控系統作為實現建筑高效管理的核心載體&#xff0c;正面臨著數據海量復雜、設備協同困難、管理響應遲緩等挑戰。而物聯網與云計算技術的深度融合&#xff0c;為樓宇自控系統的升級提供了全新的解決方案&#xff0c;賦予其智能感知、…

uni-app使用大集

1、手動修改頁面標題 uni.setNavigationBarTitle({title: 修改標題 }); 2、單選 不止有 radio-group&#xff0c;還有 uni-data-checkbox 數據選擇器 <!-- html部分 --> <uni-data-checkbox v-model"sex" :localdata"checkboxList"></u…

(6)python爬蟲--selenium

文章目錄 前言一、初識selenium二、安裝selenium2.1 查看chrome版本并禁止chrome自動更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自動更新 2.2 安裝對應版本的驅動程序2.3安裝selenium包 三、selenium關于瀏覽器的使用3.1 創建瀏覽器、設置、打開3.2 打開/關閉網頁及瀏覽器3…

基于OpenCV的人臉微笑檢測實現

文章目錄 引言一、技術原理二、代碼實現2.1 關鍵代碼解析2.1.1 模型加載2.1.2 圖像翻轉2.1.3 人臉檢測 微笑檢測 2.2 顯示效果 三、參數調優建議四、總結 引言 在計算機視覺領域&#xff0c;人臉檢測和表情識別一直是熱門的研究方向。今天我將分享一個使用Python和OpenCV實現…

Java 大視界 -- 基于 Java 的大數據分布式存儲在視頻會議系統海量視頻數據存儲與回放中的應用(263)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

Kotlin 極簡小抄 P9 - 數組(數組的創建、數組元素的訪問與修改、數組遍歷、數組操作、多維數組、數組與可變參數)

Kotlin 概述 Kotlin 由 JetBrains 開發&#xff0c;是一種在 JVM&#xff08;Java 虛擬機&#xff09;上運行的靜態類型編程語言 Kotlin 旨在提高開發者的編碼效率和安全性&#xff0c;同時保持與 Java 的高度互操作性 Kotlin 是 Android 應用開發的首選語言&#xff0c;也可…