首页 > 解决方案 > 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>();
}

任何人都知道如何为查询类提供服务?

标签: c#dependency-injectiongraphql

解决方案


您必须在启动类中编写此代码。

services.AddScoped<IServiceProvider , ServiceProvider >();

并在类中声明接口类型并传递给构造函数。

private readonly IServiceProvider _serviceProvider ;

您可以使用AddSingleton,AddTransientAddScoped根据要求


推荐阅读