【问题标题】:Asp.net core GraphQL from XML Document来自 XML 文档的 Asp.net 核心 GraphQL
【发布时间】:2020-01-20 17:30:54
【问题描述】:

所以我们有一个文档数据库,它将我们的数据存储为 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 与反射一起使用并使用此逻辑来读取字段: https://github.com/graphql-dotnet/graphql-dotnet/blob/master/src/GraphQL/Resolvers/NameFieldResolver.cs

ExpandoObject 没有我的示例 recordCount 作为属性。当我创建一个匿名类型(参见注释行)时,它可以工作。

所以我的问题是:

  1. 是否有可能创建具有可通过反射访问的动态属性的类型? (不能影响值的读取方式)

  2. GraphQL 扩展中是否有其他方法可以解决此问题?我可以配置读取值的方式吗?

期待一些提示和技巧!

谢谢, 迈克尔

【问题讨论】:

    标签: c# asp.net-core graphql


    【解决方案1】:

    所以经过一些研究和尝试,我可以自己解决它:

    可以为每个字段提供解析方法:

    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 然后在这里解决它可能更有意义...

    也许它对某人也有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多