我有一个使用 HotChocolate 11 实现的 GraphQL api。架构最近发生了变化,我想使用我们的拼接层来保持它对客户的影响。我有一个看起来像这样的突变:
type Mutation {
generate(apertures: [ApertureInput!]! templates: [TemplateInput!]!): [GeneratedApertures!]!
}
我不得不再添加一个参数,我们还添加了一个查询来获取额外的数据
type Mutation {
generate(apertures: [ApertureInput!]! templates: [TemplateInput!]! algorithm: AlgorithmInput!): [GeneratedApertures!]!
}
type Query {
standardAlgorithm: StandardAlgorithm
}
type StandardAlgorithm {
shrink: Int!
}
我想要做的是使用我们的拼接层来添加突变的旧签名,并在解析器中调用远程模式来获取额外的数据并将其传递给新的突变。我已经重命名了针迹上的新签名并创建了一个看起来像旧签名的突变:
extend type Mutation {
product_generate(apertures: [ApertureInput!]! templates: [TemplateInput!]! algorithm: AlgorithmInput!): GeneratedApertures!
@source(name: "generate" schema: "productdefinition")
@delegate(schema: "productdefinition")
generate(apertures: [ApertureInput!]! templates: [TemplateInput!]!): GeneratedApertures!
}
但是我迷失了使用拼接上下文来构建子查询。
public class GenerationMutationTypeExtension : ObjectTypeExtension
{
protected override void Configure(IObjectTypeDescriptor descriptor)
{
descriptor.Name("Mutation");
descriptor.Field("generate")
.Resolve(async ctx => {
var context = ctx.Service<IStitchingContext>();
var executor = context.GetRemoteRequestExecutor("productdefinition");
var request =
QueryRequestBuilder.New()
.SetQuery("{ standardAlgorithm { shrink } }")
.SetServices(executor.Services)
.Create();
var result = (QueryResult)await executor.ExecuteAsync(request);
var template = result.Data?["standardTemplate"];
if (template is NullValueNode || template is null) throw new GraphQLRequestException("Missing configuration!!!");
var shrink = (string)((IValueNode)((Dictionary<string, object>)template)["shrinkPercent"]).Value;
var apertures = ctx.ArgumentLiteral<IValueNode>("apertures");
var templates = ctx.ArgumentLiteral<IValueNode>("templates");
var selection = ctx.Selection.SyntaxNode.SelectionSet;
var query =
$"{{ product_generateDeposits(apertures: {apertures} templates: {templates} algorithm: {{ standardAlgorithm: {{ shrink: {shrink} }} }}) {selection} }}";
request =
QueryRequestBuilder.New()
.SetQuery(query)
.SetServices(executor.Services)
.Create();
result = (QueryResult)await executor.ExecuteAsync(request);
return result;
});
}
}
收缩的第一个查询工作正常,我得到了数据。但我很难将另一个突变放在一起。是否有更好的方法来实现这一目标?在拼接方面,文档非常模糊。