无法从程序集 'GraphQL, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null' 加载类型 'GraphQL.Http.IDocumentWriter'

Could not load type 'GraphQL.Http.IDocumentWriter' from assembly 'GraphQL, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null'

到达services.AddGraphQL时出现错误。

我尝试降级 GraphQL to 2.4 的版本,但 FuncServiceProvider 停止工作。

这是我的:

MarketScheme.cs

public class MarketScheme : Schema
{
   public MarketScheme(IServiceProvider provider) : base(provider)
   {
        Query = provider.GetRequiredService<AppQuery>();
   }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<marketContext>();

    services.AddScoped<IMarketRepository, MarketRepository>();

    services.AddScoped<IProductRepository, ProductRepository>();

    services.AddScoped<IServiceProvider>(provider => new FuncServiceProvider(provider.GetRequiredService));

    services.AddScoped<MarketScheme>();

    services.AddGraphQL(options =>
    {
        options.ExposeExceptions = true;
        options.EnableMetrics = true;
    }).AddGraphTypes(ServiceLifetime.Scoped);

    services.AddControllers();
}

这有两个部分。

  1. 接口 GraphQL.Http.IDocumentWriter 移动到 GraphQL.IDocumentWriter
  2. JSON 序列化被提取到两个不同的库中,GraphQL.NewtonsoftJson and GraphQL.SystemTextJson

如果您使用 server project, you will need to update to 4.x.

See the 2.x to 3.0 upgrade guide 如果你已经编写了自己的中间件。

Newtonsoft.Json 例子

using Newtonsoft.Json;

private static async Task ExecuteAsync(HttpContext context, ISchema schema)
{
    GraphQLRequest request;
    using (var reader = new StreamReader(context.Request.Body))
    using (var jsonReader = new JsonTextReader(reader))
    {
        var ser = new JsonSerializer();
        request = ser.Deserialize<GraphQLRequest>(jsonReader);
    }

    var executer = new DocumentExecuter();
    var result = await executer.ExecuteAsync(options =>
    {
        options.Schema = schema;
        options.Query = request.Query;
        options.OperationName = request.OperationName;
        options.Inputs = request.Variables.ToInputs();
    });

    context.Response.ContentType = "application/json";
    context.Response.StatusCode = result.Errors?.Any() == true ? (int)HttpStatusCode.BadRequest : (int)HttpStatusCode.OK;

    var writer = new GraphQL.NewtonsoftJson.DocumentWriter();
    await writer.WriteAsync(context.Response.Body, result);
}

public class GraphQLRequest
{
    public string OperationName { get; set; }
    public string Query { get; set; }
    public Newtonsoft.Json.Linq.JObject Variables { get; set; }
}

System.Text 例子

using System.Text.Json;

private static async Task ExecuteAsync(HttpContext context, ISchema schema)
{
    var request = await JsonSerializer.DeserializeAsync<GraphQLRequest>
    (
        context.Request.Body,
        new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
    );

    var executer = new DocumentExecuter();
    var result = await executer.ExecuteAsync(options =>
    {
        options.Schema = schema;
        options.Query = request.Query;
        options.OperationName = request.OperationName;
        options.Inputs = request.Variables.ToInputs();
    });

    context.Response.ContentType = "application/json";
    context.Response.StatusCode = 200; // OK

    var writer = new GraphQL.SystemTextJson.DocumentWriter();
    await writer.WriteAsync(context.Response.Body, result);
}

public class GraphQLRequest
{
    public string OperationName { get; set; }

    public string Query { get; set; }

    [JsonConverter(typeof(GraphQL.SystemTextJson.ObjectDictionaryConverter))]
    public Dictionary<string, object> Variables { get; set; }
}