簡體   English   中英

在 HotChocolate 中拼接遠程 GraphQL 模式時,`StringOperationFilterInput` 已被另一種類型注冊

[英]`StringOperationFilterInput` was already registered by another type, when stitching a remote GraphQL schema in HotChocolate

我有一個主要的 GraphQL 項目,它服務於書籍,還有一個次要項目服務於電影,兩者都包括過濾。 我想將輔助服務器的模式添加到主服務器,這樣我就可以通過將查詢轉發到輔助服務器來查詢電影。 我使用了模式拼接教程

沒有過濾效果很好(我可以跳到主服務器上的/graphql並查詢電影),但是將[UseFiltering]添加到GetMovie產生錯誤:

The name `StringOperationFilterInput` was already registered by another type. (HotChocolate.Data.Filters.StringOperationFilterInputType)

   at HotChocolate.Configuration.TypeRegistry.Register(NameString typeName, RegisteredType registeredType)

顯然,兩種模式都生成用於過濾的類型,例如StringOperationFilterInput ,但模式拼接不想合並它們。 不知道我能在這里做什么。

最小示例:主項目Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpClient("Movies", c => c.BaseAddress = new Uri("https://localhost:7001/graphql"));
builder.Services.AddGraphQLServer()
    .AddQueryType<Query>()
    .AddRemoteSchema("Movies", ignoreRootTypes: true)
    .AddTypeExtensionsFromFile("./Stitching.graphql")
    .AddFiltering();

var app = builder.Build();
app.MapGraphQL();
app.Run();

public record Book(string Name);

public class Query
{
    [UseFiltering] public IEnumerable<Book> GetBook() => new[] { new Book("A book") };
}

主要項目的Stitching.graphql

extend type Query {
  movies: [Movie!]! @delegate(schema: "Movies", path:"movie")
}

二級項目Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseUrls("https://localhost:7001/");
builder.Services.AddGraphQLServer()
    .AddQueryType<Query>()
    .AddFiltering();

var app = builder.Build();
app.MapGraphQL();
app.Run();

public record Movie(string Name);

public class Query
{
    [UseFiltering] public IEnumerable<Movie> GetMovie() => new[] { new Movie("Die Hard") };
}

我想到了。 首先,我們需要添加一個 TypeMergeHandler 來跳過已經注冊的遠程類型。 不幸的是,要跳過的重復類型必須進行硬編碼,因為沒有明顯的方法來檢查已經注冊的類型。 我根據打印的錯誤消息 GraphQL 不斷添加報告的重復類型。

builder.Services.AddTypeMergeHandler<GraphqlTypeMergeHandler>()
public class GraphqlTypeMergeHandler : ITypeMergeHandler
{
    private readonly MergeTypeRuleDelegate _next;

    private readonly string[] _duplicateTypes = new[]
    {
        "ComparableNullableOfDateTimeOperationFilterInput",
        "ComparableNullableOfDecimalOperationFilterInput",
        "ComparableNullableOfInt32OperationFilterInput",
        "BooleanOperationFilterInput",
        "StringOperationFilterInput",
        "SortEnumType",
        "PageInfo",
    };

    public GraphqlTypeMergeHandler(MergeTypeRuleDelegate next) => _next = next;

    public void Merge(ISchemaMergeContext context, IReadOnlyList<ITypeInfo> types)
    {
        var typeName = types[0].Definition.Name.Value;

        if (_duplicateTypes.Contains(typeName))
            return;

        _next(context, types);
    }
}

其次,需要調整Stitching.graphql以支持過濾,因為Movie查詢現在包含where參數:

extend type Query {
    movies(where: MovieFilterInput): [Movie!]!
    @delegate(schema: "Movies", path:"movie(where: $arguments:where)")
}

最后,我示例中的BookMovie類型是具有位置語法的記錄,而 GraphQL 類型必須具有無參數構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM