C# 从3.1.3升级到4.2.0 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

我正在将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 
    }
}
这是我的
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的dotnet
GraphQL
中间件示例。非常感谢您的帮助。

来自:

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#,所以我对如何修复这些错误感到困惑。对我的另外两个错误有什么想法吗?