无法解析“GraphQL.Http.IDocumentWriter”类型的服务

问题描述 投票:0回答:2

我在整个以下项目中仅在我的项目中使用了以下控制器。

https://github.com/graphql-dotnet/examples/blob/master/src/AspNetWebApi/Example/Controllers/GraphQLController.cs

控制器文件如下。

using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using GraphQL.Http;
using GraphQL.Instrumentation;
using GraphQL.Types;
using GraphQL.Validation.Complexity;

namespace GraphQL.GraphiQL.Controllers
{
    public class GraphQLController : ApiController
    {
        private readonly ISchema _schema;
        private readonly IDocumentExecuter _executer;
        private readonly IDocumentWriter _writer;
        private readonly IDictionary<string, string> _namedQueries;

        public GraphQLController(
            IDocumentExecuter executer,
            IDocumentWriter writer,
            ISchema schema)
        {
            _executer = executer;
            _writer = writer;
            _schema = schema;

            _namedQueries = new Dictionary<string, string>
            {
                ["a-query"] = @"query foo { hero { name } }"
            };
        }

        // This will display an example error
        [HttpGet]
        public Task<HttpResponseMessage> GetAsync(HttpRequestMessage request)
        {
            return PostAsync(request, new GraphQLQuery { Query = "query foo { hero }", Variables = null });
        }

        [HttpPost]
        public async Task<HttpResponseMessage> PostAsync(HttpRequestMessage request, GraphQLQuery query)
        {
            var inputs = query.Variables.ToInputs();
            var queryToExecute = query.Query;

            if (!string.IsNullOrWhiteSpace(query.NamedQuery))
            {
                queryToExecute = _namedQueries[query.NamedQuery];
            }

            var result = await _executer.ExecuteAsync(_ =>
            {
                _.Schema = _schema;
                _.Query = queryToExecute;
                _.OperationName = query.OperationName;
                _.Inputs = inputs;

                _.ComplexityConfiguration = new ComplexityConfiguration { MaxDepth = 15 };
                _.FieldMiddleware.Use<InstrumentFieldsMiddleware>();

            }).ConfigureAwait(false);

            var httpResult = result.Errors?.Count > 0
                ? HttpStatusCode.BadRequest
                : HttpStatusCode.OK;

            var json = _writer.Write(result);

            var response = request.CreateResponse(httpResult);
            response.Content = new StringContent(json, Encoding.UTF8, "application/json");

            return response;
        }
    }

    public class GraphQLQuery
    {
        public string OperationName { get; set; }
        public string NamedQuery { get; set; }
        public string Query { get; set; }
        public Newtonsoft.Json.Linq.JObject Variables { get; set; }
    }
}

当我尝试调用此控制器时,它给出以下错误。

InvalidOperationException: Unable to resolve service for type 'GraphQL.Http.IDocumentWriter' while attempting to activate 'MyWebAppNamespace.Controllers.GraphQLController'.

我需要任何启动配置吗?或者我可以使用这个独立控制器吗?我错过了什么?

asp.net-core-mvc graphql asp.net-core-webapi
2个回答
4
投票

我需要任何启动配置吗?或者我可以使用这个独立控制器吗?我错过了什么?

正如错误所述,发生这种情况是因为 DI 容器无法解析

IDocumentWriter
的服务。

您似乎缺少一些服务注册。您是否忘记添加

IDocumentWrite
服务?

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDependencyResolver>(s => new FuncDependencyResolver(s.GetRequiredService));

    services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
    services.AddSingleton<IDocumentWriter, DocumentWriter>();

    // ...
    services.AddSingleton<ISchema, StarWarsSchema>();
    // ...
 }

更多详情请参阅这里启动

或者我可以使用这个独立控制器?

不。你不应该这样做。这是因为您的控制器依赖于

IDocumentExecuter
IDocumentWriter
ISchema
服务。它们都是通过依赖注入解决的。在解析控制器之前,您必须注册所有服务。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.