Ядро Asp.net GraphQL из XML-документа - PullRequest
0 голосов
/ 19 сентября 2019

Итак, у нас есть база данных документов, в которой наши данные хранятся в виде файлов XML.Новым требованием является создание интерфейса graphQL для доступа к xmldocument.Я реализовал интерфейс GraphQL с расширениями:

https://github.com/graphql-dotnet/graphql-dotnet https://github.com/graphql-dotnet/server

До сих пор я мог динамически создавать поля из файла XML:

public ReferenceType(IRepository repository)
{
    var searchResult = repository.GetExampleForSchema();

    foreach(var field in searchResult.Root.Elements())
    {
        if (!field.HasElements && field.Attribute(json + "Array") == null)
        {
            Field<StringGraphType>(field.Name.LocalName);
        }
        else
        {
            //TODO: Create child ObjectGraphTypes
        }
    }
}

Но я не могу узнать, как вернуть результат в моем хранилище:

public dynamic Search()
{
    var searchResult = new ExpandoObject() as IDictionary<string, object>;
    //var searchResult = new { recordCount = 124345};
    var xDocSearch = InternalSearch();
    foreach (var field in xDocSearch.Root.Elements())
    {
        if (!field.HasElements && field.Attribute(json + "Array") == null)
        {
            var fieldName = field.Name.LocalName;
            searchResult[fieldName] = field.Value;
        }
        else
        {
            //TODO: Create child objects
        }
    }
    return searchResult;
}

Проблема в том, что GraphQL работает с Reflection и использует эту логику для чтения поля: https://github.com/graphql-dotnet/graphql-dotnet/blob/master/src/GraphQL/Resolvers/NameFieldResolver.cs

ExpandoObject не имеет моего примера recordCount в качестве свойства.Когда я создаю анонимный тип (см. Закомментированную строку), он работает.

Так что мои вопросы:

  1. Есть ли возможность создать тип с динамическими свойствами, которыеможно получить доступ с помощью отражений?(Не может повлиять на то, как читается значение)

  2. Есть ли другой способ расширения GraphQL для решения этой проблемы?Можно ли настроить способ считывания значения?

С нетерпением ждем некоторых советов и подсказок!

Спасибо, Майкл

1 Ответ

0 голосов
/ 19 сентября 2019

Таким образом, после некоторого исследования и попыток я смог решить его самостоятельно:

Можно предоставить метод разрешения для каждого поля:

if (!field.HasElements && field.Attribute(json + "Array") == null)
{
    Field<StringGraphType>(field.Name.LocalName, **resolve: ResolveXml**);
}

, и в этом методе вы можетеделай, что хочешь:

public object ResolveXml(ResolveFieldContext<object> context)
{
    var source = (IDictionary<string, object>)context.Source;

    return source[context.FieldName];
}

Теперь это только первое рабочее решение, конечно, имеет смысл возвращать в хранилище непосредственно XDocument, а затем разрешать его здесь ...

Может быть, это кому-то тоже поможет!

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