Загрузчики данных Create Per Request в GraphQL Java - PullRequest
0 голосов
/ 30 апреля 2020

Я использую GraphQL для создания API, который запрашивает некоторые конечные точки. Прямо сейчас при настройке DataLoader значения в кэше сохраняются в нескольких веб-запросах. Как предложено в документах , я хочу изменить это так, чтобы DataLoaders ограничивался для каждого запроса - то есть данные кэша из одного запроса не видны другому запросу. Документы явно не дают пример того, как go сделать это.

Я вижу эту ссылку: https://github.com/graphql-java/java-dataloader/issues/19 ... и мне было интересно, если это все еще правильно / единственный способ go? Или есть какой-то другой способ?

Спасибо.

1 Ответ

1 голос
/ 03 мая 2020

Это все та же идея.

Чтобы обработать запрос GraphQL, вы должны создать новый экземпляр ExecutionInput и настроить его параметры для каждого запроса. Одной из его настроек является объект Context (это обобщенный тип c Object, поэтому вы можете сами определять свой тип). Просто убедитесь, что этот Context объект содержит DataLoaderRegistry и убедитесь, что вы создаете новый экземпляр Context с новым экземпляром DataLoaderRegistry, который регистрирует новый экземпляр DataLoader.

Код мудрый, выглядит так:

public class MyContext {
    private DataLoaderRegistry dataLoaderRegistry;

    public MyContext(DataLoaderRegistry dataLoaderRegistry){
        this.dataLoaderRegistry = dataLoaderRegistry;
    }
}

//Process a GraphQL request

DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry();
dataLoaderRegistry.register("fooDataLoder" , DataLoader.newDataLoader("......."));

MyContext context = new MyContext(dataLoaderRegistry);


ExecutionInput executionInput = ExecutionInput.newExecutionInput()
                .query("employees {id name department}")
                .context(context)
                .dataLoaderRegistry(context.getDataLoaderRegistry())
                .build();

 GraphQL graphQL = GraphQL.newGraphQL(schema).build();
 ExecutionResult executionResult = graphQL.execute(executionInput);

Небольшое отличие состоит в том, что в некоторых более поздних версиях вам не нужно явно настройте DataLoaderDispatcherInstrumentation для GraphQL как это , так как оно будет автоматически активировано, если оно не настроено. Вместо этого просто убедитесь, что вы настроили тот же dataLoaderRegistry для ExecutionInput, который вы установили для Context, потому что DataLoaderDispatcherInstrumentation требуется доступ к DataLoaderRegistry из него.

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