.NET Core注册GraphQL泛型ResponseGraphType到DI时遇异常求助
问题分析与解决方案
错误原因
你的注册代码存在两个核心问题:
MakeGenericType()未传入任何泛型参数,ResponseGraphType<,>是开放泛型类型,必须指定具体的TGraphType和T才能生成可实例化的封闭泛型类型,直接调用无参的MakeGenericType()会导致无法构造有效类型。- 用工厂函数注册开放泛型的方式错误,.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
相关产品推荐
相关产品推荐

