系列導航
使用Hot Chocolate和.NET 6構建GraphQL應用文章索引
前言
這篇文章是這個系列的第一篇,我們會簡單地討論一下GraphQL,然后介紹一下這個系列將會使用的示例項目。
關於GraphQL
關於GraphQL和Restful API的討論已經有很多了,我在本文里不會試圖去推銷什么技術。GraphQL的官方主頁在這里GraphQL | A query language for your API,它的出現是為了解決Restful API面臨的當所需查詢的數據結構呈現及其復雜的樹狀結構或依賴關系時,需要多次按順序發送不同的Restful請求,並且需要額外的Dto對象來保證當前的API接口不會返回多余的數據,此外,當數據之間的關系發生變動導致原本的Resful API無法獲取關聯的數據時,就需要去修改接口定義。
GraphQL能通過精確定義客戶端需要的數據,無需多次請求就可以獲取無冗余的結果。關於GraphQL的基本概念就不詳細介紹了,可以參考官方文檔,或者跟着這個系列親手實現一個感受一下。
關於GraphQL和Restful API各自的優點和缺點,可以參考這篇文章REST vs GraphQL for an API。用我的理解簡單地解釋就是:
- Restful API更為開發人員所熟悉,但是我覺得文章里提到的API Client的接受度和Learning Resources現在來看幾乎都不是太大的優勢了,越來越多的主流API Client像是Postman,小眾一點的Insomia,都支持發送GraphQL請求,社區的資源也很多了。Restful API最明顯的短處在於我們必須使用Dto來減少返回數據的冗余。
- GraphQL的優勢在於它能更好地發送聚合請求,並且能夠精確定義數據使得返回值無冗余。缺點也很明顯,開發人員相對來說不夠熟悉,對文件下載的支持不好。
項目模版
這兩天抽空整理之前的內容,寫了一個基於Clean Architecture的.NET 6 Web API項目模版,放在這里了:Asinta/Code4NothingCaTempate,還沒有推到Nuget上,如果有需要使用的,可以clone到本地,在解決方案根目錄執行:
$ dotnet new --install .
// ....
Template Name Short Name Language Tags
------------------------------------------------- ---------- -------- ----
Code4Nothing Clean Architecture Solution Template ca-c4n [C#]
接下來就可以從本地使用這個模版來創建新項目了
dotnet new ca-c4n -n PostGraphi
這個解決方案模版包含了測試項目,我們在這個系列里暫時都不會用到,src目錄下的項目還是按照之前使用.NET 6開發TodoList應用文章索引這個系列里的方式進行划分,用做示例的TodoItem相關的可以作為參考實現自己的實體和相關功能。
在GraphQL的這個系列里,我們會基於這個模版來構建一個博客文章管理的示例應用,主要用來練習如何在.NET 6 Web API應用里構建GraphQL接口以及相關的功能。
領域實體關系
下圖是我們即將構建的應用涉及的實體以及相互之間的關系,一些基礎字段比如創建時間和更新時間我沒有畫上去,足夠理解用了。
關於Hot Chocolate
Hot Chocolate作為GraphQL和.NET生態中近幾年迅速獲得大量使用的GraphQL服務端框架,提供了非常方便的使用方法。你可以應用它來構建獨立的基於.NET 6的GraphQL Server,也可以用來部署在Azure Functions或者AWS Lambda上用來作為GraphQL Server,同時也可以實現GraphQL網關,一些.NET生態中推薦使用的網關框架如Envoy也支持GraphQL請求。
我們會使用這個框架來實現GraphQL的常用功能。
關於GraphQL更多的資源
- chentsulin/awesome-graphql
- graphql/graphiql
- 一個很棒的GraphQL接口可視化工具:APIs-guru/graphql-voyager