c# - 从 3.1.3 升级到 4.2.0 GraphQL 版本
问题描述
我正在将我的 GraphQL 版本从升级3.1.3
到4.2.0
. 当我编译我的代码时,我看到以下三个错误 -
找不到类型或命名空间名称“EnterLeaveListener”(您是否缺少 using 指令或程序集引用?)
“IServiceProvider”不包含“GetRequiredService”的定义,并且找不到接受“IServiceProvider”类型的第一个参数的可访问扩展方法“GetRequiredService”(您是否缺少 using 指令或程序集引用?)
“ExecutionOptions”不包含“FieldMiddleware”的定义,并且找不到接受“ExecutionOptions”类型的第一个参数的可访问扩展方法“FieldMiddleware”(您是否缺少 using 指令或程序集引用?)
这是我的InputValidationRule
班级EnterLeaveListener
正在使用班级:
public class InputValidationRule : IValidationRule
{
public Task<INodeVisitor> ValidateAsync(ValidationContext context)
{
return Task.FromResult((INodeVisitor)new EnterLeaveListener(_ =>
{
}));
return Task.FromResult((INodeVisitor)) new
}
}
这是我的GraphQLMiddleware
课:
using GraphQL;
using GraphQL.Instrumentation;
using GraphQL.NewtonsoftJson;
using GraphQL.Types;
using GraphQL.Utilities;
using GraphQL.Validation;
public class GraphQLMiddleware
{
private readonly RequestDelegate _next;
private readonly GraphQLSettings _settings;
private readonly IDocumentExecuter _executer;
private readonly IDocumentWriter _writer;
public GraphQLMiddleware(
RequestDelegate next,
GraphQLSettings settings,
IDocumentExecuter executer,
IDocumentWriter writer)
{
_next = next;
_settings = settings;
_executer = executer;
_writer = writer;
}
public async Task Invoke(HttpContext context, ISchema schema)
{
if (!IsGraphQLRequest(context))
{
await _next(context);
return;
}
await ExecuteAsync(context, schema);
}
private bool IsGraphQLRequest(HttpContext context)
{
return context.Request.Path.StartsWithSegments(_settings.Path)
&& string.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase);
}
private async Task ExecuteAsync(HttpContext context, ISchema schema)
{
var request = Deserialize<GraphQLRequest>(context.Request.Body);
var result = await _executer.ExecuteAsync(_ =>
{
_.Schema = schema;
_.Query = request?.Query;
_.OperationName = request?.OperationName;
_.Inputs = request?.Variables.ToInputs();
_.UserContext = _settings.BuildUserContext?.Invoke(context);
_.ValidationRules = DocumentValidator.CoreRules.Concat(new[] { new InputValidationRule() });
_.EnableMetrics = _settings.EnableMetrics;
if (_settings.EnableMetrics)
{
_.FieldMiddleware.Use<InstrumentFieldsMiddleware>();
}
});
await WriteResponseAsync(context, result);
}
private async Task WriteResponseAsync(HttpContext context, ExecutionResult result)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = result.Errors?.Any() == true ? (int)HttpStatusCode.BadRequest : (int)HttpStatusCode.OK;
await _writer.WriteAsync(context.Response.Body, result);
}
public static T Deserialize<T>(Stream s)
{
using (var reader = new StreamReader(s))
using (var jsonReader = new JsonTextReader(reader))
{
var ser = new JsonSerializer();
return ser.Deserialize<T>(jsonReader);
}
}
}
这是我的TitanSchema
课:
using GraphQL;
using GraphQL.Types;
using GraphQL.Utilities;
public class TitanSchema : Schema
{
public TitanSchema(IServiceProvider provider) : base(provider)
{
Query = provider.GetRequiredService<TitanQuery>();
this.RegisterTypeMapping<ProtoValue, ProtoValueType>();
}
}
所有这三个类都显示了上述三个问题。我尝试在网上查找,但无法弄清楚如何解决这些问题。也没有看到任何GraphQL
使用最新版本 GraphQL 的 dotnet 中间件示例。任何帮助将不胜感激。
解决方案
GraphQL.Utilities.ServiceProviderExtensions 已被内部化。这会影响其扩展方法 GetRequiredService 的使用。相反,请参考 Microsoft.Extensions.DependencyInjection.Abstractions NuGet 包并使用 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions 类中的扩展方法。
因此,您需要做的就是添加对Microsoft.Extensions.DependencyInjection.Abstractions
包的 nuget 引用(如果您还没有)并添加
using Microsoft.Extensions.DependencyInjection;
到你的TitanSchema
班级。
推荐阅读
- android - 颤振应用程序未与firebase数据库连接
- shell - 运行一个需要密码的脚本
- python - 通过签入另一个 df 从 df 中删除不匹配的行
- python - 如何在熊猫数据框中将数据从对象/字符串格式获取到 int?
- c - 赋值形式不兼容的指针类型
- sql - 查询检查一个值是否存在,以及它是否不添加表中的所有行?
- php - 登录/登录后如何区分用户和管理员的主页?
- express - Express JS:总是得到消息:TypeError:赋值给常量变量
- c++ - 将 XPointer/XPath 搜索添加到所有(?) C++ JSON 库,是否可行?
- r - 在ggplot中按因子重新排序x值