概述
是时候从“Hello world”升级到“Hello playlists”了!
在本课中,我们将
- 检查一个模拟设计并创建一个GraphQL 模式 从中
- 创建我们的第一个 对象类型
- 学习如何 文档化 一个 GraphQL 模式 使用
[GraphQLDescription]
属性
模拟
首先,让我们看看 MusicMatcher 应用程序中的这个页面
它展示了一个精选的流行播放列表网格,你可能对此感兴趣!
分解每个播放列表,我们可以开始看到客户端应用程序需要哪些数据。这个将模拟分解成数据片段的过程称为模式优先设计。
播放列表需要一个名称和一个描述,这两个都是文本。
即使我们没有在 Hot Chocolate 中实现模式优先方法(也就是说,我们没有在 SDL 中编写模式),考虑我们的类型和 字段 以及我们的 解析器 函数将根据模拟设计和应用程序开发人员期望的数据进行定义,仍然很有帮助。
The Playlist
类型
让我们从 Playlist
类型开始。在 Types
文件夹中,创建一个名为 Playlist
的新类。
namespace Odyssey.MusicMatcher;public class Playlist{// Playlist properties go here}
在 Playlist
类中,我们将首先定义播放列表的名称作为属性,它返回一个 string
类型。
public string Name { get; set; }
默认情况下,此 字段 是不可为空的,因此播放列表需要 一个名称。
注意:我们正在使用 自动实现属性的简写语法。
现在,我们在“Name”下面会得到一个黄色的波浪线,并显示一条警告,说
Non-nullable property 'Name' must contain a non-null value when exiting constructor.Consider declaring the property as nullable.
别担心,我们稍后会解决这个问题。
接下来,让我们定义播放列表的描述,它也是一个 string
类型。描述可以 为 null
,因此我们将使用 ?
符号将其标记为这样。
public string? Description { get; set; }
还有一件事!即使它不是模拟的一部分,定义类的标识符 也是常见的做法。展望未来,当我们点击一个播放列表时,我们需要有一种方法来检索该特定播放列表的详细信息,这正是标识符(或 ID)的作用。
播放列表的 ID 将是一个 string
类型,但我们希望将其映射到一个 GraphQL 标量 类型,而不是 String
。为此,我们将添加 Hot Chocolate 属性 [ID]
。
[ID]public string Id { get; }
我们正在使用来自 Relay 规范的 [ID]
属性,因为它是在 GraphQL 中常用的模式,而 [ID]
属性在我们的代码中更简单。为了使用正确的 Hot Chocolate 类型,我们可以用 [GraphQLType(typeof(IdType))]
代替 [ID]
。
我们还省略了 set;
方法,因为我们通常不希望更改 ID。
我们为播放列表定义的三个属性(Id
、Name
和 Description
)充当这些 解析器 的 字段。在幕后,Hot Chocolate 将每个具有 get
访问器的属性转换为一个 解析器。
探索模式
这个 Playlist
类在我们的 GraphQL 模式 中现在是什么样子?让我们来了解一下!
我们需要用我们的 GraphQL 服务器 注册 Playlist
类,所以打开 Program.cs
文件并找到我们初始化服务器的地方。
我们将链接另一个名为 AddType
的方法,并将 Playlist
传入。
builder.Services.AddGraphQLServer().AddQueryType<Query>().AddType<Playlist>();
保存所有更改并重新启动服务器。
回到 Sandbox,让我们看看Schema 页面。在左侧选择 Objects 并点击 Playlist。
太棒了,我们已经考虑了所有播放列表的 字段!
现在,详细信息列显示“无描述”。虽然字段名称现在感觉相当自解释,但最好记录您模式的类型和字段,尤其是对于我们图的消费者。
记录我们的模式
我们使用GraphQL 描述来记录模式。(不要与我们播放列表的描述混淆字段!)在 Hot Chocolate 中,我们使用[GraphQLDescription]
属性,它接受一个string
作为参数,用于描述类型或字段。
回到我们的Playlist
类,让我们在类定义和属性上方添加[GraphQLDescription]
。
[GraphQLDescription("A curated collection of tracks designed for a specific activity or mood.")]public class Playlist{[GraphQLDescription("The ID for the playlist.")][ID]public string Id { get; }[GraphQLDescription("The name of the playlist.")]public string Name { get; set; }[GraphQLDescription("Describes the playlist, what to expect and entices the user to listen.")]public string? Description { get; set; }}
保存我们的更改,重新启动服务器并切换到 Sandbox 以查看我们清晰且有用的描述!
The Playlist
constructor
我们的Playlist
类中仍然有一些黄色的波浪线和警告(现在是两个!),让我们修复它们。
我们将为该类创建一个构造函数,传入id
和name
参数。我们可以让描述保持原样,因为它可以为空。
public Playlist(string id, string name){Id = id;Name = name;}
我们将在下一课中使用这些来创建Playlist
类的实例。
练习
Playlist
类中的 Id
属性上使用 [ID] 属性有什么作用?创建一个 Artist
类,该类生成具有以下字段的 GraphQL 类型:id: ID!
, name: String!
, followers: Int
和 popularity: Float
。请注意每个字段的类型及其可空性。
主要要点
- 将模型分解为数据片段并根据客户端应用程序需求实现功能称为模式优先设计。
- The
[GraphQLDescription]
attribute is used to add clear and helpful descriptions to GraphQL types and fields. It will be displayed in GraphQL IDEs such as Apollo Sandbox. - The
[ID]
attribute defines the identifier for the GraphQL type. It indicates that the associated property represents a unique identifier.
接下来
我们需要一种方法来查询播放列表。现在,它只是漂浮在我们的模式中,没有办法访问它。让我们通过我们的Query
类型(我们模式的入口点!)使其可用。
分享您对本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。没有吗? 请改在 Odyssey 论坛上发布。