6. 构建模式
5m

概述

是时候从“Hello world”升级到“Hello playlists”了!

在本课中,我们将

  • 检查一个模拟设计并创建一个 从中
  • 创建我们的第一个
  • 学习如何 一个 使用[GraphQLDescription] 属性

模拟

首先,让我们看看 MusicMatcher 应用程序中的这个页面

A grid of featured playlists

它展示了一个精选的流行播放列表网格,你可能对此感兴趣!

分解每个播放列表,我们可以开始看到客户端应用程序需要哪些数据。这个将模拟分解成数据片段的过程称为模式优先设计

The same mockup but with labels for each piece of data

播放列表需要一个名称和一个描述,这两个都是文本。

即使我们没有在 Hot Chocolate 中实现模式优先方法(也就是说,我们没有在 中编写模式),考虑我们的类型和 以及我们的 函数将根据模拟设计和应用程序开发人员期望的数据进行定义,仍然很有帮助。

The Playlist 类型

让我们从 Playlist 类型开始。在 Types 文件夹中,创建一个名为 Playlist 的新类。

Types/Playlist.cs
namespace Odyssey.MusicMatcher;
public class Playlist
{
// Playlist properties go here
}

Playlist 类中,我们将首先定义播放列表的名称作为属性,它返回一个 string 类型。

Types/Playlist.cs
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,因此我们将使用 ? 符号将其标记为这样。

Types/Playlist.cs
public string? Description { get; set; }

还有一件事!即使它不是模拟的一部分,定义类的标识符 也是常见的做法。展望未来,当我们点击一个播放列表时,我们需要有一种方法来检索该特定播放列表的详细信息,这正是标识符(或 ID)的作用。

播放列表的 ID 将是一个 string 类型,但我们希望将其映射到一个 类型,而不是 String。为此,我们将添加 Hot Chocolate 属性 [ID]

Types/Playlist.cs
[ID]
public string Id { get; }

我们正在使用来自 Relay 规范的 [ID] 属性,因为它是在 中常用的模式,而 [ID] 属性在我们的代码中更简单。为了使用正确的 Hot Chocolate 类型,我们可以用 [GraphQLType(typeof(IdType))] 代替 [ID]

我们还省略了 set; 方法,因为我们通常不希望更改 ID。

我们为播放列表定义的三个属性(IdNameDescription)充当这些 解析器。在幕后,Hot Chocolate 将每个具有 get 访问器的属性转换为一个

探索模式

这个 Playlist 类在我们的 中现在是什么样子?让我们来了解一下!

我们需要用我们的 注册 Playlist 类,所以打开 Program.cs 文件并找到我们初始化服务器的地方。

我们将链接另一个名为 AddType 的方法,并将 Playlist 传入。

Program.cs
builder.Services.AddGraphQLServer().AddQueryType<Query>()
.AddType<Playlist>();

保存所有更改并重新启动服务器。

回到 Sandbox,让我们看看Schema 页面。在左侧选择 Objects 并点击 Playlist

https://studio.apollographql.com/sandbox/schema

Sandbox showing Schema Reference and Objects selected

太棒了,我们已经考虑了所有播放列表的

https://studio.apollographql.com/sandbox/schema

Sandbox showing Playlist schema

现在,详细信息列显示“无描述”。虽然名称现在感觉相当自解释,但最好您模式的类型和字段,尤其是对于我们的消费者。

记录我们的模式

我们使用 描述模式。(不要与我们播放列表的描述混淆字段!)在 Hot Chocolate 中,我们使用[GraphQLDescription]属性,它接受一个string作为,用于描述类型或

回到我们的Playlist类,让我们在类定义和属性上方添加[GraphQLDescription]

Types/Playlist.cs
[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 以查看我们清晰且有用的描述!

https://studio.apollographql.com/sandbox/schema

Sandbox showing Playlist schema with descriptions

The Playlist constructor

我们的Playlist类中仍然有一些黄色的波浪线和警告(现在是两个!),让我们修复它们。

我们将为该类创建一个构造函数,传入idname 。我们可以让描述保持原样,因为它可以为空。

public Playlist(string id, string name)
{
Id = id;
Name = name;
}

我们将在下一课中使用这些来创建Playlist类的实例。

练习

Playlist 类中的 Id 属性上使用 [ID] 属性有什么作用?
关于模式文档,以下哪些说法是正确的?
在 Apollo Sandbox 中,您将导航到哪个页面以详细了解您的 GraphQL 模式?
代码挑战!

创建一个 Artist 类,该类生成具有以下字段的 GraphQL 类型:id: ID!, name: String!, followers: Intpopularity: Float。请注意每个字段的类型及其可空性。

加载中…
加载进度

主要要点

  • 将模型分解为数据片段并根据客户端应用程序需求实现功能称为模式优先设计。
  • The [GraphQLDescription] attribute is used to add clear and helpful descriptions to types and . It will be displayed in GraphQL IDEs such as .
  • The [ID] attribute defines the identifier for the type. It indicates that the associated property represents a unique identifier.

接下来

我们需要一种方法来播放列表。现在,它只是漂浮在我们的模式中,没有办法访问它。让我们通过我们的Query类型(我们模式的入口点!)使其可用。

上一个

分享您对本课的疑问和评论

本课程目前处于

测试版
.您的反馈有助于我们改进!如果您遇到困难或感到困惑,请告知我们,我们将帮助您。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下面发布。没有吗? 请改在 Odyssey 论坛上发布。