Kotlin Apollo Client与GraphQL:重命名自动生成类及类复用问询
解决Apollo Client Kotlin生成重复MetaData类的问题
一、避免自动生成带数字后缀的类名
Apollo Client默认会给重复的嵌套类型添加数字后缀(比如MetaData1),你可以通过配置命名规则来阻止这种行为:
在项目的build.gradle.kts(Groovy项目用build.gradle)的Apollo配置块中,设置typeNaming策略,强制保留类型的原始SDL名称,不管它属于哪个父类型:
apollo { service("yourServiceName") { packageName.set("com.your.package") codegen { // 保留SDL中定义的类型名称,避免自动加数字 typeNaming.set(TypeNaming.Preserve) } } }
如果需要更灵活的命名逻辑,也可以自定义TypeNaming实现,比如始终用类型的SDL名称作为生成类的名字:
apollo { service("yourServiceName") { packageName.set("com.your.package") codegen { typeNaming.set(object : TypeNaming { override fun name(type: Type): String { // 直接返回SDL中定义的类型名 return type.sdlName } }) } } }
二、复用同一个MetaData类
要彻底让Car和Person复用同一个类,最优方案是从GraphQL Schema层面统一定义:
1. 统一Schema中的类型定义
如果原来的Schema里,Car和Person的MetaData是各自内嵌的匿名/独立类型,把它提取成顶层公共类型,让两个父类型都引用它:
修改前的Schema:
type Car { id: ID! metaData: { createdAt: String! updatedAt: String! } } type Person { id: ID! metaData: { createdAt: String! updatedAt: String! } }
修改后的Schema:
// 提取为公共顶层类型 type MetaData { createdAt: String! updatedAt: String! } type Car { id: ID! metaData: MetaData! } type Person { id: ID! metaData: MetaData! }
这样Apollo Client生成代码时,会自动生成一个MetaData类,Car和Person的metaData属性都会引用这个类,完全复用。
2. 无法修改Schema时的替代方案
如果不能调整Schema,可以通过typeMapping配置,将两个嵌套类型映射到同一个Kotlin类:
apollo { service("yourServiceName") { packageName.set("com.your.package") // 将Car和Person的metaData类型都映射到同一个自定义类 typeMapping.set(mapOf( "Car.metaData" to "com.your.package.MetaData", "Person.metaData" to "com.your.package.MetaData" )) } }
注意:这种方式需要你手动创建MetaData类,或者确保生成的类名称一致后再做映射。
内容的提问来源于stack exchange,提问作者padmalcom
相关产品推荐
相关产品推荐

