解决Strawberry Shake集成GraphQL的构造函数定位错误及相关疑问
问题描述
使用Strawberry Shake创建GraphQL客户端时,通过HttpClient注册服务遇到错误:
无法找到类型'Common.Clients.LocationGqlApi.LocationGqlApi'的合适构造函数
疑问:
- 我哪里操作出错了?
- GraphQL集成与REST API集成是否存在差异?
相关代码:
Program.cs
services.AddHttpClient<ILocationGqlApi, LocationGqlApi>();
Service.cs
namespace Returns.Services { public interface ILocationService { public Task<bool> IsSchedulingLocation(string locationCode); } public class LocationService : ILocationService { private readonly ILocationGqlApi _locationGqlApi; public LocationService(ILocationGqlApi locationGqlApi) { _locationGqlApi = locationGqlApi; } public async Task<bool> IsSchedulingLocation(string locationCode) { var locationQlResponse = await _locationGqlApi.LocationByCode.ExecuteAsync(locationCode, LocationConstants.Capability); // Do something } } }
解答
1. 操作错误点
Strawberry Shake生成的GraphQL客户端不能直接用AddHttpClient注册,因为它的构造函数并非标准HttpClient注入的形式。Strawberry Shake有专属的服务注册方式,你得用它自动生成的扩展方法来注册客户端,而非手动通过AddHttpClient绑定接口与实现。
正确注册方式示例(Program.cs):
// AddLocationGqlApi是Strawberry Shake生成代码时自动创建的扩展方法 services.AddLocationGqlApi() .ConfigureHttpClient(client => { client.BaseAddress = new Uri("你的GraphQL API地址"); });
你之前直接调用AddHttpClient<ILocationGqlApi, LocationGqlApi>(),DI容器找不到LocationGqlApi的合适构造函数,原因是它的构造函数依赖Strawberry Shake内部的客户端组件,而非直接的HttpClient实例。
2. GraphQL集成与REST API集成的差异
- 客户端生成逻辑:REST一般手动封装HttpClient或用Refit等工具生成代理;Strawberry Shake基于GraphQL Schema生成强类型客户端,内置查询、突变的类型安全方法,无需手动拼接请求内容。
- 服务注册方式:REST可直接用
AddHttpClient注册自定义API服务;Strawberry Shake必须用自身提供的扩展方法注册,因为它内部封装了GraphQL请求的序列化、缓存、订阅等专属逻辑,依赖特定的服务注入链。 - 请求模式:REST是多端点资源模式,每个资源对应一个接口;GraphQL通常是单端点(如/graphql),通过不同的查询/突变体获取或修改数据,一次请求可获取多个关联资源,减少网络请求次数。
- 类型安全程度:Strawberry Shake生成的客户端完全贴合Schema,返回类型和参数都是强类型,编译阶段就能发现错误;REST需要手动定义DTO,容易出现类型不匹配、字段遗漏等问题。
内容的提问来源于stack exchange,提问作者GThree
相关产品推荐
相关产品推荐

