使用别名
在生成代码时,Apollo Kotlin使用您的字段名称生成匹配的泛型模型,并使用平面层次结构。以下查询:
GetContact.graphql
query GetContact {contact(name: "Byron") {# The generated model will be named `HomeAddress`homeAddress {street}# The generated model will be named `WorkAddress`workAddress {country}}}
将生成如下模型
class GetContact {class Data { ... }class Contact { ... }class HomeAddress { ... }class WorkAddress { ... }}
命名规则的驱动原则是
- 用 字段 名称作为模型名称:我们考虑使用模式类型名称,但这将导致许多冲突。在上例中,例如,我们将有两个不同的
Address
类。 - 保持类的扁平层次结构:我们考虑使用嵌套类,但这可能导致非常长的名称,而扁平层次结构更容易阅读。
- 当它是列表时,将 字段 名称变为单数:如果您的 查询 包含列表字段,例如
nodes
(例如),生成List<Node>
而不是List<Nodes>
更有意义。
这些原则对大多数情况都非常适用,但不能解决名称冲突或特殊的单数规则。为了解决这些问题,您可以使用 GraphQL别称。
使用别称来避免名称冲突
由于类层次结构是扁平的,查询树中不同部分具有相同名称的两个 字段 可能导致名称冲突。拥有大量 nodes
或 edges
字段 的简化式分页可能会通常触发名称冲突。为了避免这些问题,Apollo Kotlin 将向您的模型附加数字后缀:'
GetContact.graphql
query GetContacts {contact(name: "Byron") {# The generated model will be named `HomeAddress`homeAddress {street}}emergencyContact {# The generated model will be named `HomeAddress1` by defaulthomeAddress {street}}}
后缀避免了名称冲突,但感觉有点不合适,而且很难记住 HomeAddress1
是什么的。为了解决此问题,您可以对 字段 进行 别名:
GetContact.graphql
query GetContacts {contact(name: "Byron") {# The generated model will be named `HomeAddress`homeAddress {street}}emergencyContact {# With an alias, the generated model will be named `EmergencyAddress`emergencyAddress: homeAddress {street}}}
使用别称来解决单数化规则问题
该 单数化代码在大多数情况下有效,但不包含英语词典中的所有例外。
如果您遇到一个,请告诉我们,这样我们可以在这里放置一个有效的示例(我们通常在前进中解决这些问题,但的确还有一些问题在野外)。在我们修复单个化代码之前,您可以使用别名来控制代码中模型的名字。