使用别名
在生成代码时,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
比生成List
更有意义。
这些原则在很多情况下都很有效,但不能解决名称冲突或特殊的单数化规则。为了解决这些问题,你可以使用GraphQL别名。
使用别名避免名称冲突
由于类层次结构是扁平的,查询树不同部分中存在同名字段可能会导致名称冲突。在具有许多节点
或边
字段的回传式分页中,通常可能会触发名称冲突。为了避免这种情况,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}}}
使用别名处理单复数规则
大多数情况下,以下是关于单复数规则的单复数处理代码工作良好,但它不包含英语字典中的所有例外。
如果您遇到一个,请告诉我们,这样我们就可以在这里添加一个有效示例(我们通常会边走边解决问题,但确实还有几个遗留问题)。在我们修复单复数处理代码之前,您可以使用一个别名来控制代码中模型的名字。