来自 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 页面上