Не удалось разрешить службу для типа 'GraphQL.Http.IDocumentWriter' - PullRequest
0 голосов
/ 11 ноября 2018

Я использовал только один контроллер в моем проекте из всего следующего проекта.

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'.

Нужна ли мне какая-либо начальная конфигурация или я могу использовать этот автономный контроллер? Чего мне не хватает?

1 Ответ

0 голосов
/ 12 ноября 2018

Нужна ли мне какая-либо начальная конфигурация или я могу использовать этот автономный контроллер? Чего мне не хватает?

Как описывает ошибка, это происходит из-за того, что контейнер 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. Все они разрешены Внедрение зависимости . Вы должны зарегистрировать все службы, прежде чем разрешить контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...