c# - GraphQL dotnet core 查询类依赖注入
问题描述
Query
更新:以前的空错误是因为创建了一个没有参数的类的空构造函数。现在我删除了那个空的构造函数,但是得到一个新的错误:System.MissingMethodException: No parameterless constructor defined for type 'App.Controllers.Graphs.Query'
如何将服务注入 GraphQL Query 类?(模式优先方法)
在我的 dotnet core 3.1 项目中,我安装了:GraphQL.Server.Transports.AspNetCore 3.5.0-alpha0046
这是我的根图:
public class RootGraph : Schema
{
public RootGraph(IServiceProvider provider) : base(provider)
{
var schema = For(@"
type Player {
_id: ID!
dbname: String!
isPremium: Boolean!
games: [String]!
}
input PlayerView {
dbname: String!
isPremium: Boolean!
}
type Query {
player(dbname: String!): Player
}
", _ =>
{
_.Types.Include<Query>();
});
Console.WriteLine(provider); // <-- provider is not null here, everything is good
Query = schema.Query;
}
}
然后我像这样创建我的查询类:
public class Query
{
private readonly ServiceProvider serviceProvider;
private readonly IPlayerService playerService;
public Query( IServiceProvider serviceProvider )
{
this.serviceProvider = serviceProvider as ServiceProvider;
this.playerService = serviceProvider.GetService<IPlayerService>();
}
[GraphQLMetadata("player")]
public async Task<Player> GetPlayer(string dbname)
{
Console.WriteLine(serviceProvider);
Player player = await playerService.Get(dbname);
return player;
}
}
但它不起作用。无法创建 Query 类,因为我在这里遇到异常:
System.MissingMethodException: No parameterless constructor defined for type 'App.Controllers.Graphs.Query'.\r\n
at System.RuntimeType.CreateInstanceDefaultCtorSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean fillCache)\r\n
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, Boolean wrapExceptions)\r\n
at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)\r\n
at System.Activator.CreateInstance(Type type)\r\n
at GraphQL.DefaultServiceProvider.GetService(Type serviceType)\r\n
我的一部分Startup.cs
:
public void ConfigureServices(IServiceCollection services){
...
// add services
services.AddSingleton<IPlayerService, PlayerService>();
// add GraphQL
services.AddSingleton<RootGraph>();
services.AddSingleton<Query>();
}
任何人都知道如何为查询类提供服务?
解决方案
您必须在启动类中编写此代码。
services.AddScoped<IServiceProvider , ServiceProvider >();
并在类中声明接口类型并传递给构造函数。
private readonly IServiceProvider _serviceProvider ;
您可以使用AddSingleton
,AddTransient
或AddScoped
根据要求
推荐阅读
- c# - 如何在工具栏控件下方对齐 WPF 工具包颜色选择器位置
- typescript - 如何解决“Readonly<{}> 类型上不存在属性“导航”&
- python - 了解不一致的 cythonized 代码行为 - PyQt5 与 PySide2
- apache-spark - pyspark:为什么缓存这么慢
- mysql - 在 tmp 表中聚合 MySQL 中的数据
- python - 当我尝试打开模块时,pudb3 引发 TypeError
- javascript - 如何更改按钮的颜色,以便在使用 jQuery 单击按钮时更改为另一种颜色?
- sql - 如何使用同一表中另一列的计数更新列
- matlab - 解释一个涉及二进制过滤器的matlab代码的含义
- c# - 更改刻度和滑块控件以显示较小的数字