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



到达services.AddGraphQL时发生错误。

我尝试将GraphQL的版本降级到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和GraphQL.SystemTextJson

如果您正在使用服务器项目,则需要更新到4.x.

如果您已经编写了自己的中间件,请参阅2.x到3.0的升级指南。

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; }
}

最新更新