Graphql 热巧克力合并来自其余端点的数据

Graphql hot chocolate merge data from rest endpoints

我正在创建一个热巧克力服务作为合并来自多个休息端点的数据的网关。但是我很难找到任何资源来解释如何将 guid 解析为来自其他端点的对象。

例如,一个服务有一个包含产品的数据库,另一个服务有一个包含评论的数据库。

如何设置热巧克力以便执行此查询?

query {
  product(id: $id) {
    id
    title
    review {
      comment
    }
  }
}
```

您需要做的是创建一个 ObjectType 解析 集合。类似于...

using HotChocolate.Types;

public class ProductResolvers: ObjectType<Product>
{
    protected override void Configure(IObjectTypeDescriptor<Models.Product> descriptor)
    {
        descriptor.Field(fld => fld.Reviews)
                  .Resolve(async (context, ct) =>
                  {
                      var prodID = context.Parent<Models.Product>().Id);
                      var ProductReviews= await SomeMethodToGetReviews(prodID);

                      return ProductReviews;
                  });
    }
}        

获得 解析器 后,您需要在 Startup

中注册它
services.AddGraphQLServer()
        .AddQueryType(q => q.Name("Query"))
        .AddType<ProductsQuery>()
        .AddType<ReviewsQuery>()
        .AddType<ProductResolvers>()  // <=== Register your product resolver class here

Hot Chocolate 的伟大之处在于,如果您没有在请求中指定 Reviews,那么 Review 服务甚至都不会被调用。非常高效...

我最终使用了数据加载器和扩展类型的产品,如下所示:

[ExtendObjectType(typeof(Product))]
public class ProductExtensions
{
public async Task<Review> GetReviewAsync(
    [Parent] Product product,
    ReviewDataLoader dataLoader)
    {
        return await dataloader.LoadAsync(product.Id)
    }
}

然后像这样添加扩展类型:

services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .AddTypeExtension<ProductExtensions>()
    .AddDataLoader<ReviewDataLoader>()