无法从程序集 '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();
}
这有两个部分。
- 接口
GraphQL.Http.IDocumentWriter
移动到 GraphQL.IDocumentWriter
。
- 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; }
}
到达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();
}
这有两个部分。
- 接口
GraphQL.Http.IDocumentWriter
移动到GraphQL.IDocumentWriter
。 - 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; }
}