autoguru-au/hotchocolate-polymorphic-ids

GitHub: autoguru-au/hotchocolate-polymorphic-ids

为HotChocolate添加多态ID支持,简化GraphQL API的数据库ID处理。

Stars: 18 | Forks: 0

# 多态ID

Nuget version NuGet downloads

本包为 [ChilliCream](https://chillicream.com/) 的 [HotChocolate](https://github.com/ChilliCream/hotchocolate) 添加了对多态 Relay / Global ID 的支持,以便您可以将数据库 ID 作为输入/参数中的 `ID` 传递,它将被接受。 例如,如果您阅读 GitHub 的 GraphQL API 中 `ID` 类型的描述,它说: 以下成为可能(在带有 HotChocolate 的 `[ID]` 属性注解的 args/input 字段上)。 ``` # 模式 type Query { booking(id: ID!): Booking } # 查询 query { bookingByGlobalId: booking(id: "TheGlobalIdValue7sghdyg=") { ... } bookingByDbId: booking(id: 1) { ... } bookingByDbIdString: booking(id: "1") { ... } } ``` ## 更多详情 ### 为什么你会这样做? 1. 为了实现友好的 URL,如 `/booking/123`,您需要能够通过其数据库 ID (`123`) 来获取预订,因为客户端没有全局 ID。但是,为了这样做而公开 `bookingByDbId(id: Int!)` 字段是很糟糕的。 2. 为了更容易调试。作为人类,我们使用数据库 ID。所以如果你有一个,你只需将其传递即可。 ### 支持的内容是什么? 当字段声明了带有 `[ID]` 属性或流畅风格的 `.ID()`(例如 `descriptor.Field(x => x.SomeId).ID()`)时,会注意到参数/输入字段;两者都添加了多态 ID 处理。 当一个字段通过属性声明了显式的类型名称(例如 `[ID("Booking")]`)时,传入的 *全局* ID 将被验证是否确实属于该类型——不同类型的全局 ID 将被拒绝,就像 Hot Chocolate 内置的行为一样。原始数据库 ID 不携带类型名称,因此它们总是被接受(这正是整个目的所在)。 数组 ID 被处理(但只有 v2+ 可以支持 nullable ID 的数组(`[ID]` 或 `[ID]!`),这是由于 Hot Chocolate v11 中的一个错误)。 内部表示为 `int`、`Guid`、`long` 或 `string` 的 ID 以及它们的可空等效项将被处理。您可以根据需要选择退出每个的支持。 对于基于整数的 ID,您可以传递 `"1"` 或 `1`,两者都将被接受。 对于所有其他类型,您需要传递字符串值,例如: * 全局 ID 的字符串值:`"26a2dc8f-4dab-408c-88c6-523a0a89a2b5"` * 基于长整型的 ID 的字符串值:`"123456789"` ### 有任何缺点吗? 1. 字符串是一个问题。很难区分全局 ID 格式和字符串数据库 ID。 因此,在这种情况下,我们尝试将其读取为全局 ID,如果抛出异常,则将其视为数据库 ID。 一个问题在于,无效的全局 ID,例如你漏掉了一个字符,将被视为数据库 ID。 如果你没有字符串数据库 ID,关闭其处理是一个好主意,这样无效的全局 ID 仍然会抛出异常(见下面的设置)。 2. 拦截会有性能损失,但几乎可以忽略不计。 3. 一旦你走上了这条路,就很难回头,因为你的客户端将开始依赖它。 ## 设置 安装 [兼容版本](#Compatibility) 的 [NuGet 上的包](https://www.nuget.org/packages/AutoGuru.HotChocolate.PolymorphicIds) ``` dotnet add package AutoGuru.HotChocolate.PolymorphicIds ``` 在您的模式(`ISchemaBuilder`)或执行器(`IRequestExecutorBuilder`)上配置它: ``` .AddGlobalObjectIdentification() // Required since Hot Chocolate v12.6.0+ .AddPolymorphicIds(new PolymorphicIdsOptions { HandleGuidIds = false, // true by default HandleIntIds = true, // true by default HandleLongIds = false, // true by default HandleStringIds = false, // true by default }); ``` ### 声明式地添加 dbId 字段 在 AutoGuru,我们为所有节点添加一个 `dbId` 字段。由于这本质上与声明节点的 `id` 字段相同,因此我们有一些辅助工具可以在这里找到。 目前这是一件手动/显式的事情,但将来这最好通过类型拦截器自动完成,如果我能想出如何让它工作(上一次尝试失败了 :P)。 ## 兼容性 我们依赖于 [HotChocolate.Types](https://www.nuget.org/packages/HotChocolate.Types) (之前是 [HotChocolate.Execution](https://www.nuget.org/packages/HotChocolate.Execution),Hot Chocolate 从 v16 版本开始停止作为独立包发布)可能会带来破坏性的更改,并要求我们进行重大升级。兼容性如下。 我们努力匹配 Hot Chocolate 支持的 .NET 目标框架,尽管这可能并不总是可能的。 | HotChocolate | 多态 ID | 我们的文档 | | ------------ | --------------- | -----------| | v16.0.0 | v7 | 正在这里 | | v15.0.0 | v6 | [/v6/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v6/main) 分支 | | v14.0.0 | v5 | [/v5/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v5/main) 分支 | | v13.0.0 | v4 | [/v4/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v4/main) 分支 | | v12.6.0* | v3 | [/v3/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v3/main) 分支 | | v12.0.0 | v2 | [/v2/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v2/main) 分支 | | v11.1.0 | v1 | [/v1/main](https://github.com/autoguru-au/hotchocolate-polymorphic-ids/tree/v1/main) 分支 | \* 表示意外的二进制不兼容性/破坏性更改
标签:API Development, ChilliCream, Database ID, Database Integration, Debugging, Friendly URL, Global ID, GraphQL, HotChocolate, ID Handling, Input Argument, NuGet, Polymorphic ID, Query Language, Relay, Schema Design, Software Libraries, Web Development, 多人体追踪