Не удалось вызвать Activator.CreateInstance с GraphQL и ядром. NET - PullRequest
1 голос
/ 02 марта 2020

При выполнении запроса я получаю эту ошибку: {"failed to call activator.createinstance. type: api.graphql.lessonquery"}

Конструктор Lessonquery выглядит следующим образом:

private readonly AppDbContext _db;

public LessonQuery(AppDbContext dbContext)
    {
        _db = dbContext;
    }

И я добавил services.AddSingleton<AppDbContext>(); к ConfigureServices() в файле startup.cs

Я включил в схему свой класс LessonQuery

public LessonSchema()
{
    this._schema = Schema.For(@"

    type Lesson {
        id: ID,
        title: String,
        level: String,
        exercises : [String]
    }

    type Query {
        lessons: [Lesson],
        lesson(id: ID): [Lesson]
    }


", _ =>
    {
        _.Types.Include<LessonQuery>();

    });

Я ищу способ исправить эту ошибку?

1 Ответ

1 голос
/ 02 марта 2020

По умолчанию GraphQL. NET использует Activator.CreateInstance для создания классов, но для этого требуется конструктор без параметров. Если вы хотите использовать Dependency Injection с GraphQL. NET, вам нужно присвоить Схеме IServiceProvider.

public LessonSchema(IServiceProvider sp)
{
    this._schema = Schema.For(@"

    type Lesson {
        id: ID,
        title: String,
        level: String,
        exercises : [String]
    }

    type Query {
        lessons: [Lesson],
        lesson(id: ID): [Lesson]
    }


", _ =>
    {
        _.ServiceProvider = sp;
        _.Types.Include<LessonQuery>();

    });

Редактировать: я только что обнаружил, что в версии 2.4.0 бехвор отличался , Здесь вам нужно создать IDependencyResolver вместо IServiceProvider. Самый простой способ подключить существующее IServiceProvider из ASP. NET Core к GraphQL. NET - это использовать FuncDependencyResolver примерно так:

public LessonSchema(IServiceProvider sp)
{
    this._schema = Schema.For(@"

    type Lesson {
        id: ID,
        title: String,
        level: String,
        exercises : [String]
    }

    type Query {
        lessons: [Lesson],
        lesson(id: ID): [Lesson]
    }


", _ =>
    {
        _.DependencyResolver = new FuncDependencyResolver(t => sp.GetService(t));
        _.Types.Include<LessonQuery>();

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