Я новичок в graphql и использую его в основном решении .Net. Мое решение включает базу данных SQlite, доступ к которой можно получить через менеджер. Я использую менеджер в функциях распознавателя в моих GraphTypes. В моделях у меня есть класс «Билет» и класс «Билет-ответ» — один билет включает в себя список ответов на билеты.
Проблема в том, что я не могу включить вложенные данные ObjectGraphType. Вот мой код:
namespace SupportCenter.Schema.GraphQLTypes
{
public class TicketType : ObjectGraphType<Ticket>
{
public TicketType(ITicketManager manager)
{
Name = "Ticket";
Field(x => x.Id, type: typeof(IdGraphType)).Description("The id of the ticket");
Field(x => x.AccountId).Description("THe account the ticket was issued from");
Field(x => x.Text).Description("The description of the problem");
Field(x => x.DateOpened).Description("The date the ticket was opened");
Field<TicketStateEnum>("state", resolve: context => context.Source.State);
Field<ListGraphType<TicketResponseType>>("ticketresponses",
resolve: context => manager.GetTicketResponses(context.Source.Id));
}
}
}
Ошибка, которую я получаю, следующая:
"GraphQL.ExecutionError: No service for type 'GraphQL.Types.ObjectGraphType
1[SupportCenter.Schema.GraphQLTypes.TicketType]' has been registered. ---> System.InvalidOperationException: No service for type 'GraphQL.Types.ObjectGraphType1[SupportCenter.Schema.GraphQLTypes.TicketType]' has been registered.\n at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)\n at GraphQL.Types.Schema.b__56_2(Type type)\n at GraphQL.Types.GraphTypesLookup.AddTypeIfNotRegistered(Type type, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.HandleField(Type parentType, FieldType field, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.AddType(IGraphType type, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.HandleField(Type parentType, FieldType field, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.AddType(IGraphType type, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.HandleField(Type parentType, FieldType field, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.AddType(IGraphType type, TypeCollectionContext context)\n at GraphQL.Types.GraphTypesLookup.Create(IEnumerable1 types, IEnumerable1 directives, Func2 resolveType, IFieldNameConverter fieldNameConverter)\n at System.Lazy1.ViaFactory(LazyThreadSafetyMode mode)\n--- End of stack trace from previous location where exception was thrown ---\n at System.Lazy`1.CreateValue()\n at GraphQL.Types.Schema.get_AllTypes()\n at GraphQL.Instrumentation.FieldMiddlewareBuilder.ApplyTo(ISchema schema)\n at GraphQL.DocumentExecuter.ExecuteAsync(ExecutionOptions options)\n --- End of inner exception stack trace ---",
Я зарегистрировал как TicketType, так и TicketResponseType в службах в файле запуска. Любые идеи, что я делаю неправильно?
Вот мой файл запуска:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<SupportCenterDbContext>();
services.AddSingleton<TicketType>();
services.AddSingleton<TicketInputCreateType>();
services.AddSingleton<TicketResponseType>();
services.AddSingleton<TicketStateEnum>();
services.AddSingleton<ResponseQuery>();
services.AddSingleton<ITicketManager, TicketManager>();
services.AddSingleton<SupportCentreQuery>();
services.AddSingleton<TicketsQuery>();
services.AddSingleton<TicketsMutation>();
services.AddSingleton<SupportCentreSchema>();
services.AddSingleton<IDependencyResolver>(
c => new FuncDependencyResolver(c.GetRequiredService));
services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
services.AddSingleton<IDocumentWriter, DocumentWriter>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IGraphQLExecuter<SupportCentreSchema>, DefaultGraphQLExecuter<SupportCentreSchema>>();
services.AddGraphQL(options =>
{
options.EnableMetrics = true;
options.ExposeExceptions = true;
})
.AddWebSockets()
.AddDataLoader();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseGraphQL<SupportCentreSchema>("/graphql");
app.UseGraphiQLServer(new GraphiQLOptions
{
GraphiQLPath = "/ui/graphiql",
GraphQLEndPoint = "/graphql"
});
app.UseMvc();
}
}
Хорошо, я добавлю код регистрации службы


Вероятно, вам также следует показать код регистрации службы. Кроме того, это, вероятно, не должно проходить через поиск службы в первую очередь IMO; тип не должен был отсутствовать.