.NET Core Web API集成GraphQL提示找不到ContactDTO对应服务报错
问题原因
错误是由ProjectType类中contact字段的类型定义错误直接引发的:
- 你错误使用了
InterfaceGraphType<ContactDTO>作为字段类型,InterfaceGraphType是用于声明GraphQL接口类型的泛型类,你既没有提前定义对应的Contact接口Graph类型,也没有将InterfaceGraphType<ContactDTO>注册到依赖注入容器,因此DI容器解析服务时报找不到对应类型的错误。 - 你已经实现了对应ContactDTO的对象Graph类型
ContactType,完全不需要使用接口类型声明该字段。 - 额外的错误配置:Startup.cs中注册了
ContactDTO,DTO是普通数据传输对象,不需要注册到DI容器,属于多余配置。
解决方案
- 修改ProjectType中contact字段的定义,替换为已实现的ContactType,同时补充字段的解析逻辑:
public class ProjectType : ObjectGraphType<ProjectDTO> { public ProjectType() { Name = "Project"; Field(_ => _.Id).Description("Project Id"); Field(_ => _.Title).Description("Project Title"); Field(_ => _.Description).Description("Project Description"); Field(_ => _.ConfirmationCode).Description("Project Confirmation Code"); Field(_ => _.Options).Description("Project Options (\"As a comma separated list\")"); Field(_ => _.ProjectStatus).Description("Project Status (\"As an integer\")"); Field(_ => _.CreatedTime).Description("Project Creation Time"); Field(_ => _.UpdatedTime).Description("Project Update Time"); Field(_ => _.EstimatedCompletion).Description("Estimated Completion Date"); // 替换错误的接口类型声明为ContactType,补充resolve逻辑 Field<ContactType>( name: "contact", description: "The contact that requested this project", resolve: context => context.Source.Contact ); } }
注意:上述代码中
context.Source对应当前解析的ProjectDTO实例,需确保你的ProjectDTO类中存在名为Contact的ContactDTO类型属性,如属性名不同请对应修改。
- 删除Startup.cs中多余的ContactDTO注册:
找到services.AddScoped<ContactDTO>();这一行直接删除即可。
如果你确实有使用GraphQL接口类型的需求,需额外完成以下步骤:
- 定义ContactInterface类继承
InterfaceGraphType<ContactDTO>,完成接口字段声明 - 将ContactInterface注册到DI容器
- 修改ContactType实现该接口
- 再在ProjectType中使用
InterfaceGraphType<ContactDTO>声明字段,同时配置接口的类型映射规则
内容的提问来源于stack exchange,提问作者Duncan McPherson
相关产品推荐
相关产品推荐

