来自 XML 文档的 Asp.net 核心 GraphQL

Posted

技术标签:

【中文标题】来自 XML 文档的 Asp.net 核心 GraphQL【英文标题】:Asp.net core GraphQL from XML Document 【发布时间】: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 作为属性。当我创建一个匿名类型(参见注释行)时,它可以工作。

所以我的问题是:

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

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

也许它对某人也有帮助!

【讨论】:

以上是关于来自 XML 文档的 Asp.net 核心 GraphQL的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 核心 MVC 弹出模式,其中包含来自视图的模型数据

jquery 循环和分配来自 Asp.net 核心 Razor 页面 foreach 的数据

如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?

来自 FTP 的图像未显示在 asp.net 核心的 HTML 页面上

数据表中的多个子行,来自asp.net核心中sql server的数据

如何将xml文档作为字符串传递给asp.net webservice