【问题标题】:GraphQL dotnet core Query class dependency injectionGraphQL dotnet core 查询类依赖注入
【发布时间】:2021-03-31 19:56:48
【问题描述】:

更新:之前的 null 错误是因为创建了一个没有参数的 Query 类的空构造函数。现在我删除了那个空的构造函数,但是得到一个新的错误:System.MissingMethodException: No parameterless constructor defined for type 'App.Controllers.Graphs.Query'


如何将服务注入 GraphQL Query 类? (架构优先方法)

在我的 dotnet core 3.1 项目中,我安装了:GraphQL.Server.Transports.AspNetCore3.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>();
}

有人知道如何为 Query 类提供服务吗?

【问题讨论】:

    标签: c# dependency-injection graphql


    【解决方案1】:

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

    services.AddScoped<IServiceProvider , ServiceProvider >();
    

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

    private readonly IServiceProvider _serviceProvider ;
    

    您可以根据需要使用AddSingletonAddTransientAddScoped

    【讨论】:

    • 似乎没有必要这样做,因为我的 RootGraph 类工作得很好。
    【解决方案2】:

    所以根据this thread,我需要做的就是在架构配置中指定服务提供者,像这样:

        public RootGraph(IServiceProvider provider) : base(provider)
        {
          var schema = For(@"...", _ =>
          {
            _.Types.Include<Query>();
            _.ServiceProvider = provider; // <=== Add this line here
    
          });
    
          // ...
    
        }
    
    

    【讨论】:

      【解决方案3】:

      您应该能够直接注入它而无需使用 IServiceProvider。 像这样的:

      [GraphQLMetadata("Query")] 
      public class Query
        {
          private readonly IPlayerService playerService; 
      
          public Query(IPlayerService playerService)
          {
            this.playerService = playerService;
          }
      
          [GraphQLMetadata("player")]
          public async Task<Player> GetPlayer(string dbname)
          {
            Console.WriteLine(serviceProvider);
            Player player = await playerService.Get(dbname);
            return player;
          }
        }
      

      然后在您的 SchemaFile 中,您必须将 ServiceProvider 添加到您的架构中。

        public class RootGraph : Schema
        {
          public RootGraph(IServiceProvider provider) 
              : base(provider)
          {
            var schema = For(@"
              ...
            ", _ =>
            {
              _.Types.Include<Query>();
              _.ServiceProvider = provider;
            });
          }
        }
      

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 2020-11-30
        • 2017-07-14
        • 2021-08-25
        • 2019-01-18
        • 1970-01-01
        • 2023-02-24
        • 1970-01-01
        • 2016-05-22
        相关资源
        最近更新 更多