You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core注册GraphQL泛型ResponseGraphType到DI时遇异常求助

问题分析与解决方案

错误原因

你的注册代码存在两个核心问题:

  1. MakeGenericType()未传入任何泛型参数,ResponseGraphType<,>是开放泛型类型,必须指定具体的TGraphType和T才能生成可实例化的封闭泛型类型,直接调用无参的MakeGenericType()会导致无法构造有效类型。
  2. 用工厂函数注册开放泛型的方式错误,.NET Core DI容器本身支持直接注册开放泛型,无需手动通过反射构造实例。

另外,异常提示提到的IProvideMetadata,是因为ResponseGraphType继承的ObjectGraphType间接实现了该接口,但你的注册方式导致容器误解了服务类型与实现类型的匹配关系。

正确注册方式

方式1:注册开放泛型(推荐)

如果你希望DI容器在需要具体泛型版本(比如ResponseGraphType<UserGraphType, User>)时自动创建实例,直接注册开放泛型即可:

services.AddScoped(typeof(ResponseGraphType<,>));

此时容器会在解析特定的ResponseGraphType<TGraphType, T>时,自动构造实例,前提是TGraphType和Response<T>的依赖能被容器正常解析。

方式2:注册特定的封闭泛型实例

如果你需要注册某个具体的泛型版本(比如针对用户模型的响应类型),可以直接指定具体类型:

// 直接注册具体泛型类型
services.AddScoped<ResponseGraphType<UserGraphType, User>>();

// 若需要自定义构造逻辑(比如注入额外依赖)
services.AddScoped(sp => 
{
    // 从容器中获取所需依赖
    var someDependency = sp.GetRequiredService<ISomeDependency>();
    // 构造具体泛型实例
    return new ResponseGraphType<UserGraphType, User>();
});

方式3:注册为GraphType基类

如果需要将ResponseGraphType<,>注册为GraphType的实现,可按如下方式注册开放泛型:

services.AddScoped(typeof(GraphType), typeof(ResponseGraphType<,>));

内容的提问来源于stack exchange,提问作者blfuentes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:05:33