HotChocolate v13 GraphQL如何去除输入类型的"Input"后缀?
解决HotChocolate输入类型自动追加"Input"后缀且避免同名冲突的问题
针对你用C# + HotChocolate构建GraphQL API时遇到的两个核心问题——取消输入类型自动加"Input"后缀、解决同一类型同时作为输入和普通对象的同名冲突,这里提供几个可行方案:
方案一:显式标记输入类型并指定名称
你之前用[GraphQLName]无效,是因为HotChocolate自动识别输入类型时会忽略该属性并强制追加后缀。只要主动给类加上[InputObject]标记,再指定名称,就能覆盖默认行为:
[InputObject] [GraphQLName("ProductFilter")] public record ProductFilter { // 字段定义 }
这种方式适合单个类型的精准控制,直接强制该类型以你指定的名称作为输入对象,不会自动加后缀。
方案二:改进自定义命名约定,针对性处理冲突
如果项目里有大量这类类型,不想逐个加属性,可以修改自定义命名约定,给同时作为输入和普通对象的类型单独保留后缀,其他类型取消自动追加:
public class CustomNamingConvention : DefaultNamingConventions { // 把需要区分的冲突类型加入集合 private readonly HashSet<Type> _conflictingTypes = new() { typeof(MailingAddress) }; public override string GetTypeName(Type type, TypeKind kind) { if (kind == TypeKind.InputObject) { // 冲突类型保留默认的Input后缀,其他类型直接用类名 return _conflictingTypes.Contains(type) ? base.GetTypeName(type, kind) : type.Name; } return base.GetTypeName(type, kind); } }
然后在服务注册时替换默认约定:
services.AddGraphQLServer() .AddNamingConvention<CustomNamingConvention>() // 其他GraphQL配置
这种方式既能全局取消自动加后缀,又能避免冲突类型的命名重复。
方案三:拆分冲突类型为独立DTO(直接但冗余)
如果冲突类型不多,也可以专门为输入场景创建独立的DTO,比如MailingAddressInput,和原MailingAddress分开使用。这种方式代码量会增加,但能彻底避免命名冲突,适合输入和输出类型结构有差异的场景。
内容的提问来源于stack exchange,提问作者nyan-cat
相关产品推荐
相关产品推荐

