如何解决使用 ObjectType 字段扩展类型
我是 HotChocolate 和 GraphQL 的新手,我在类型扩展方面遇到了一些困难。
是否可以使用 ObjectType
字段扩展类型?我在文档中只找到了一个带有 StringType
的示例:
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.Name("Person");
descriptor.Field("address")
.Type<StringType>()
.Resolver("Address");
}
我尝试过做类似的事情,但我有这个例外 HotChocolate.SchemaException: Unable to resolve type reference Output: ObjectType
。
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.Name("Person");
descriptor.Field("address")
.Type<ObjectType>()
.Resolver(ctx => new ObjectType(d => d.Field("street").Type<StringType>().Resolver("Street")));
}
在我的情况下,您能否建议使用 ObjectType
字段扩展类型的任何方法?或者只是回答是否可能?
谢谢!
解决方法
假设您的类 Book 包含一些 JSON 字段“数据”。 'Data' 的结构可以在重新启动之间更改,但在任何启动之前都是已知的(即您在启动时知道属性名称及其类型)。 以下代码解决了这种情况:
using System.Linq;
using HotChocolate.Resolvers;
using HotChocolate.Types;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Linq;
namespace Ademchenko.GraphQLWorkshop
{
public class Book
{
public int Id { get; set; }
public JObject Data { get; set; }
}
public interface IBookService { IQueryable<Book> GetAll(); }
public class InMemoryBookService : IBookService
{
private readonly Book[] _staticBooks = {
new Book {Id = 11,Data = JObject.FromObject(new {Title = "FooBook",AuthorId = 1,Price = 10.2m})},new Book {Id = 22,Data = JObject.FromObject(new { Title = "BarBook",AuthorId = 2,Price = 20.2m})}
};
public IQueryable<Book> GetAll() => _staticBooks.AsQueryable();
}
public class Query
{
public IQueryable<Book> GetBooks(IResolverContext ctx) => ctx.Service<IBookService>().GetAll();
}
public class BookType : ObjectType<Book>
{
protected override void Configure(IObjectTypeDescriptor<Book> descriptor)
{
descriptor.Field(d => d.Data).Type<DataType>();
}
}
public class DataType : ObjectType
{
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.Field("title").Type<StringType>().Resolve((ctx,ct) => (string)ctx.Parent<JObject>()["Title"]);
descriptor.Field("authorId").Type<IntType>().Resolve((ctx,ct) => (int)ctx.Parent<JObject>()["AuthorId"]);
descriptor.Field("price").Type<DecimalType>().Resolve((ctx,ct) => (decimal)ctx.Parent<JObject>()["AuthorId"]);
}
}
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) => Configuration = configuration;
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSingleton<IBookService,InMemoryBookService>();
services.AddGraphQLServer()
.AddQueryType<Query>()
.AddType<BookType>();
}
public void Configure(IApplicationBuilder app,IWebHostEnvironment env) => app.UseRouting().UseEndpoints(endpoints => endpoints.MapGraphQL());
}
}
向服务器发出请求:
{
books
{
id,data
{
title
authorId
price
}
}
}
您将收到以下回复:
{
"data": {
"books": [
{
"id": 11,"data": {
"title": "FooBook","authorId": 1,"price": 1
}
},{
"id": 22,"data": {
"title": "BarBook","authorId": 2,"price": 2
}
}
]
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。