.Net环境GraphQL 2.4.0自定义remitsGeneralSearch类型无法解析报错
问题根因
该报错是GraphQL.NET 2.4.0版本的固有特性限制导致,核心原因有两点:
- 直接使用泛型类型
ConnectionGraphType<ClaimPaymentSearchGraphType>、ConnectionGraphType<CheckSearchGraphType>作为Union成员时,该版本不会自动处理泛型类型的名称生成,默认生成的类型名包含不符合GraphQL规范的特殊字符,导致类型系统无法识别对应类型。 - 没有显式绑定Union成员GraphType与Resolver返回的CLR类型的映射关系,执行阶段解析返回结果时无法匹配到正确的GraphType,因此抛出
Unexpected type错误。
解决方案
按照以下步骤修改即可修复问题:
步骤1:自定义带显式合法名称的Connection类型
不要直接使用泛型ConnectionGraphType<T>,自定义子类并指定符合GraphQL规范的唯一名称:
// 自定义理赔支付查询连接类型 public class ClaimPaymentSearchConnectionType : ConnectionGraphType<ClaimPaymentSearchGraphType> { public ClaimPaymentSearchConnectionType() { // 显式指定合法的GraphQL类型名,不能包含特殊字符 Name = "ClaimPaymentSearchConnection"; } } // 自定义支票查询连接类型 public class CheckSearchConnectionType : ConnectionGraphType<CheckSearchGraphType> { public CheckSearchConnectionType() { Name = "CheckSearchConnection"; } }
步骤2:修改UnionGraphType定义,显式绑定CLR类型映射
调整ClaimPaymentOrCheckSearchGraphType的构造逻辑,增加GraphType与CLR返回类型的绑定:
[Transient] public class ClaimPaymentOrCheckSearchGraphType : UnionGraphType { private readonly ILogger<ClaimPaymentOrCheckSearchGraphType> _logger; public ClaimPaymentOrCheckSearchGraphType(ILogger<ClaimPaymentOrCheckSearchGraphType> logger, // 注入自定义的Connection类型 ClaimPaymentSearchConnectionType claimPaymentConnectionType, CheckSearchConnectionType checkConnectionType) { _logger = logger; // 注册Union成员并显式绑定对应的CLR返回类型 var paymentType = Type<ClaimPaymentSearchConnectionType>(); paymentType.CLRType = typeof(Connection<ClaimPaymentSearchRow>); var checkType = Type<CheckSearchConnectionType>(); checkType.CLRType = typeof(Connection<CheckSearchRow>); ResolveType = obj => { try { if (obj is Connection<ClaimPaymentSearchRow>) { return claimPaymentConnectionType; } if (obj is Connection<CheckSearchRow>) { return checkConnectionType; } throw new ArgumentOutOfRangeException($"Could not resolve graph type for {obj.GetType().Name}"); } catch (Exception e) { _logger.LogInformation("ClaimPaymentOrCheckSearchGraphType Exception {e}: ", e); throw e; } }; } }
步骤3:注册自定义类型到DI容器
在你的DI配置逻辑中,新增两个自定义Connection类型的注册,生命周期和Union类型保持一致即可:
// 示例为ASP.NET Core的DI注册,根据你使用的DI容器调整即可 services.AddTransient<ClaimPaymentSearchConnectionType>(); services.AddTransient<CheckSearchConnectionType>();
原有Resolver的代码无需修改,调整完成后重启服务即可正常解析Union类型返回结果。
内容的提问来源于stack exchange,提问作者dionysus
相关产品推荐
相关产品推荐

