C# 从3.1.3升级到4.2.0 GraphQL版本
我正在将GraphQL版本从C# 从3.1.3升级到4.2.0 GraphQL版本,c#,asp.net-core,graphql,C#,Asp.net Core,Graphql,我正在将GraphQL版本从3.1.3升级到4.2.0。当我编译代码时,我看到以下三个错误- 找不到类型或命名空间名称“EnterLeaveListener”(是否缺少using指令或程序集引用?) “IServiceProvider”不包含“GetRequiredService”的定义,并且找不到接受“IServiceProvider”类型的第一个参数的可访问扩展方法“GetRequiredService”(是否缺少using指令或程序集引用?) “ExecutionOptions”不包含“F
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
}
}
这是我的TitanSchema
课程:
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);
}
}
}
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.Types;
使用GraphQL.Utilities;
公共类架构:Schema
{
公共架构(IServiceProvider提供程序):基本(提供程序)
{
Query=provider.GetRequiredService();
这是.RegisterTypeMapping();
}
}
所有这三个类都显示了上述三个问题。我试着在网上查找,但不知道如何解决这些问题。也没有看到任何使用最新版本GraphQL的dotnetGraphQL
中间件示例。非常感谢您的帮助。来自:
GraphQL.Utilities.ServiceProviderExtensions已设置为内部。这会影响其扩展方法GetRequiredService的使用。相反,请参考Microsoft.Extensions.DependencyInjection.Abstractations NuGet包,并使用Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions类中的扩展方法
因此,您所需要做的就是将nuget引用添加到Microsoft.Extensions.DependencyInjection.Abstractations(如果您还没有),然后添加
using Microsoft.Extensions.DependencyInjection;
致您的
TitanSchema
课程。谢谢您的链接。你能提供一个如何在我上面的代码中使用它的例子吗?请参阅更新的answer@AndyP如果这个答案对您有帮助,请将其标记为已接受。它对我的一个错误有帮助,但我如何修复其他两个错误?这就是我困惑的地方。我最近刚开始学习C#,所以我对如何修复这些错误感到困惑。对我的另外两个错误有什么想法吗?