So verwenden Sie HotChocolate, um die Schlüsselanweisung auf Objekttypen in GraphQL anzuwenden

So verwenden Sie HotChocolate, um die Schlüsselanweisung auf Objekttypen in GraphQL anzuwenden
So verwenden Sie HotChocolate, um die Schlüsselanweisung auf Objekttypen in GraphQL anzuwenden

Optimieren von Objekttypen mit der Schlüsselanweisung in HotChocolate

Wenn Sie GraphQL mit HotChocolate verwenden, müssen Sie möglicherweise Ihre Objekttypen mit Anweisungen erweitern, z @Schlüssel Richtlinie, um die Kompatibilität mit Apollo Federation sicherzustellen. Dies ist besonders wichtig für Verbundschemata, in denen Schlüssel Entitäten über mehrere Dienste hinweg identifizieren. Es ist wichtig zu verstehen, wie Sie Ihre Objekttypen mit diesen Anweisungen angemessen gestalten.

In diesem Artikel erfahren Sie, wie Sie es verwenden Heiße Schokolade zum Dekorieren von Objekttypen mit dem @Schlüssel Richtlinie. Wir werden uns auch bestimmte Beispiele ansehen, die C#-Code verwenden, um eine einfache Lösung zu erstellen Elternteil Klasse und wie man das erzeugte GraphQL-Schema ändert. Der Schwerpunkt liegt auf den tatsächlichen Maßnahmen, die Sie möglicherweise ergreifen, um diese Funktionalität zu erstellen.

Wenn Sie HotChocolate zum Erstellen von GraphQL-Objekttypen verwenden, wird die @Schlüssel Die Richtlinie wird möglicherweise nicht wie erwartet sofort angewendet. Stattdessen erzeugt das Schema möglicherweise eine einfache Typstruktur, der wichtige für die Föderation erforderliche Funktionen fehlen. Wir gehen darauf ein, wie Sie dieses Problem lösen und dafür sorgen, dass Ihr Schema wie erwartet funktioniert.

Wir behandeln auch wichtige Konfigurationsaufgaben, wie z. B. das Ändern Ihres GraphQL-Server-Setups und die Verwendung des richtigen Heiße Schokolade Und Apollo-Föderation Pakete. Mit der richtigen Konfiguration können Sie problemlos Anweisungen anwenden und eine ordnungsgemäße Schemaföderation für Ihre Dienste sicherstellen.

Befehl Anwendungsbeispiel
[Schlüssel] In HotChocolate dekoriert dieser Befehl einen Objekttyp mit dem @Schlüssel Richtlinie. Es definiert, welches Feld als eindeutige Kennung des Typs im Umgang mit Apollo Federation dient.
[ReferenceResolver] Bei Anwendung auf eine Methode weist dieses Attribut HotChocolate an, diese Methode als Auflösung für föderierte Typen zu verwenden. Es ermöglicht den Abruf relevanter Daten in Verbunddiensten über externe Referenzen.
.AddApolloFederation() Dieser Befehl konfiguriert die Apollo Federation-Unterstützung im HotChocolate GraphQL-Server. Es ist erforderlich, Funktionen des Verbundschemas zu aktivieren, z @Schlüssel Richtlinie.
.RegisterService() Registriert einen Dienst, z ParentRepository, im GraphQL DI-Container. Dadurch können Sie Dienste direkt in den GraphQL-Resolver einspeisen.
Direktive @key(fields: String!) Im SDL-Modell gibt diese Direktive das Hauptschlüsselfeld für die Föderation an. Um eine dienstübergreifende Entitätsauflösung zu ermöglichen, müssen Objekttypen über Folgendes verfügen @Schlüssel Richtlinie.
ISchemaAsync.ExecuteAsync() Führt asynchron eine GraphQL-Abfrage aus, die häufig in Komponententests verwendet wird, um sicherzustellen, dass das Schema und die Anweisungen, wie z @Schlüssel, werden ordnungsgemäß umgesetzt.
[Service] Diese Funktion wird verwendet, um Abhängigkeiten wie Repositorys oder Dienste in Argumente der GraphQL-Resolver-Methode einzufügen und so den Dienstabruf in HotChocolate zu ermöglichen.
Assert.Contains() Der Unit-Testing-Befehl von XUnit wird verwendet, um sicherzustellen, dass bestimmte Zeichenfolgen oder Anweisungen wie die @Schlüssel -Direktive werden während Tests in das generierte GraphQL-Schema einbezogen.

Die Rolle wichtiger Richtlinien in HotChocolate verstehen

Das erste Skript erklärt, wie man das implementiert @Schlüssel Direktive mit HotChocolate in C#. Dieses Skript garantiert, dass das erstellte GraphQL-Schema das enthält @Schlüssel Richtlinie für die Föderation mit der Apollo Federation. Das Skript beginnt mit der Erstellung eines Elternteil Klasse und Zuweisung der [Schlüssel] Und [AUSWEIS] Attribute zu seinen Feldern. Diese Eigenschaften sind wichtig, um HotChocolate zum Markieren zu informieren Ausweis Feld als eindeutige Kennung der Entität. Dies ist von entscheidender Bedeutung, wenn Sie einen föderierten GraphQL-Dienst erstellen, in dem Entitäten von mehreren Diensten gemeinsam genutzt werden können. Durch Markieren dieses Felds kann der GraphQL-Dienst die Entität in Verbundabfragen auflösen.

Der ReferenceResolver Funktion ist auch ein wesentlicher Bestandteil des Skripts. Diese statische Funktion ermöglicht es HotChocolate, die Entität aufzulösen, indem es nach sucht Elternteil Objekt in einem Repository. Der ParentRepository ist beim GraphQL-Server registriert und die Erhalten Methode ruft ein übergeordnetes Element anhand seiner ab Ausweis. Im Bootstrap-Code ist die .AddQueryType Anweisung registriert die Abfrage Objekt, das zum Ausführen von GraphQL-Abfragen verwendet wird. RegisterService ermöglicht das Einfügen von Abhängigkeiten wie ParentRepository in GraphQL-Resolver. Dieses Design vereinfacht den Datenabruf und sorgt gleichzeitig für eine klare Trennung der Belange.

Das zweite Beispiel verfolgt einen Schema-First-Ansatz und verwendet GraphQL SDL (Schema Definition Language), um das zu definieren @Schlüssel Direktive innerhalb des Schemas. Diese Lösung ist besonders effektiv für Teams, die bereits mit der SDL-Syntax von GraphQL vertraut sind. In diesem Beispiel ist die @Schlüssel Die Richtlinie wird auf die angewendet Elternteil Art, deutlich unter Angabe der Ausweis Feld als eindeutige Kennung. Durch die Verwendung von Schema-First haben Entwickler mehr Kontrolle darüber, wie das GraphQL-Schema erstellt und geändert wird, ohne in C#-Code einsteigen zu müssen, was es zu einer flexibleren Option für größere Teams macht.

Abschließend überprüft die Komponententestkomponente, ob der Code wie vorgesehen funktioniert. Unter Verwendung des xUnit-Testframeworks wird Assert.The Contains verwendet Der Befehl stellt sicher, dass das resultierende Schema Folgendes enthält @Schlüssel Richtlinie. Dieser Test validiert das Schema auf das Vorhandensein von @Schlüssel -Anweisung, die bestätigt, dass der Dienst ordnungsgemäß für die Föderation konfiguriert ist. Unit-Tests sind eine bewährte Methode, um sicherzustellen, dass Änderungen an Ihrem GraphQL-Schema oder Ihren Resolver-Methoden die Funktionalität nicht beeinträchtigen, insbesondere in einem Verbundsystem, in dem mehrere Dienste nahtlos zusammenarbeiten müssen.

Implementierung der Key-Direktive in HotChocolate für GraphQL-Objekttypen

Diese Lösung verwendet C#, HotChocolate und Apollo Federation, um ein GraphQL-Schema vom Backend aus zu ändern.

using HotChocolate;
using HotChocolate.Types;
using HotChocolate.Types.Relay;
using Microsoft.Extensions.DependencyInjection;
public class Parent
{
    public Parent(string id, string name)
    {
        Id = id;
        Name = name;
    }
    [Key]
    [ID]
    public string Id { get; }
    public string Name { get; }
    [ReferenceResolver]
    public static Parent? Get(ParentRepository repository, string id)
    {
        return repository.GetParent(id);
    }
}
public class Query
{
    public Parent GetParent(string id, [Service] ParentRepository repository)
    {
        return repository.GetParent(id);
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddGraphQLServer()
        .AddQueryType<Query>()
        .RegisterService<ParentRepository>()
        .AddApolloFederation();
}

Verwendung des GraphQL-Schemas Erster Ansatz zur Anwendung der @key-Direktive

Diese Lösung verwendet den Schema-First-Ansatz mit GraphQL SDL und HotChocolate, um ein benutzerdefiniertes Schema mit einer @key-Direktive zu erstellen.

type Parent @key(fields: "id") {
    id: ID!
    name: String!
}
extend type Query {
    parent(id: ID!): Parent
}
extend type Mutation {
    createParent(id: ID!, name: String!): Parent
}
directive @key(fields: String!) on OBJECT | INTERFACE

schema {
    query: Query
    mutation: Mutation
}

Unit-Test von HotChocolate GraphQL mit @key-Direktive

Hier ist ein C#-Komponententest, der das xUnit-Framework verwendet, um sicherzustellen, dass der HotChocolate-Server die @key-Direktive in einem GraphQL-Schema ordnungsgemäß anwendet.

using Xunit;
using HotChocolate.Execution;
using Microsoft.Extensions.DependencyInjection;
public class ParentTests
{
    [Fact]
    public async Task ParentSchema_ContainsKeyDirective()
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddGraphQLServer()
            .AddQueryType<Query>()
            .AddApolloFederation();
        var serviceProvider = serviceCollection.BuildServiceProvider();
        var schema = await serviceProvider.GetRequiredService<ISchemaAsync>().ExecuteAsync();
        Assert.Contains("@key(fields: \"id\")", schema.ToString());
    }
}

Verbesserung von GraphQL mit Apollo Federation und HotChocolate

Die Verwendung von GraphQL mit HotChocolate in einer Verbundumgebung erfordert ein gut strukturiertes Schema-Stitching. Mit Apollo Federation können Entwickler Schemata über mehrere Dienste hinweg partitionieren und dabei eine einheitliche Schnittstelle beibehalten. Mit der @Schlüssel Mit der HotChocolate-Direktive können Sie angeben, wie GraphQL-Entitäten über mehrere Dienste hinweg aufgelöst werden. Dadurch wird Ihre API modularer und skalierbarer, was besonders in großen, verteilten Systemen von Vorteil ist, in denen mehrere Teams verschiedene Aspekte des GraphQL-Schemas steuern.

In einem typischen föderierten Schema sind Entitäten wie Elternteil kann in vielen Diensten vorhanden sein. Apollo Federation nutzt die @Schlüssel Direktive zur eindeutigen Identifizierung einer Entität basierend auf einem angegebenen Feld, z Ausweis. Die Unterstützung von HotChocolate für Apollo Federation stellt sicher, dass sich Ihr Service mühelos in eine größere Infrastruktur integrieren lässt. Zusätzlich zum Festlegen von Schlüsseln können Sie Federation-Direktiven wie as verwenden @extends oder @external um Datenfelder zu verwalten, die über mehrere Microservices verteilt sind, was eine größere Flexibilität für Ihr GraphQL-Setup bietet.

Ein weiterer wichtiger Faktor bei der Verwendung von HotChocolate ist die Leistungsoptimierung. Das übermäßige Abrufen von Daten ist ein häufiges Problem bei GraphQL-APIs, insbesondere in Verbundkontexten. Verwendung der richtigen Resolver, wie z ReferenceResolver Die oben beschriebene Vorgehensweise stellt sicher, dass Ihre API nur die erforderlichen Daten ohne übermäßige Suchvorgänge liefert. Darüber hinaus unterstützt HotChocolate erweiterte Abfrage-Batching- und Caching-Algorithmen, die die API-Antwortgeschwindigkeit und Effizienz in einem föderierten Schema erhöhen können.

Häufige Fragen zu HotChocolate und Apollo Federation

  1. Wie kommt Apollo Federation der GraphQL-Entwicklung zugute?
  2. Mit Apollo Federation können Sie GraphQL-Schemata in viele Dienste aufteilen, von denen jeder für einen Abschnitt des Schemas verantwortlich ist und dennoch eine konsistente API beibehält.
  3. Was ist das @key Direktive, die in HotChocolate verwendet wird?
  4. Der @key Die Direktive erstellt eine eindeutige Kennung für eine Entität und ermöglicht so deren Auflösung über mehrere GraphQL-Dienste hinweg.
  5. Kann ich verwenden [Key] Und [ID] Attribute zusammen in HotChocolate?
  6. Ja, das [Key] Eigentum wird für die Föderation verwendet, und [ID] Gibt das Feld als Bezeichner innerhalb des Schemas an.
  7. Was bedeutet .RegisterService in HotChocolate tun?
  8. .RegisterService Registriert einen Dienst, beispielsweise ein Repository, beim GraphQL-Server und ermöglicht so die Abhängigkeitsinjektion innerhalb Ihrer Resolver.
  9. Wie testet man GraphQL-Schemas mit HotChocolate?
  10. HotChocolate ermöglicht Schematests mithilfe von Unit-Tests, indem es das Schema aufruft und nach Anweisungen wie sucht @key im resultierenden Ergebnis.

Abschluss des Föderationsprozesses

Verwendung von HotChocolate @Schlüssel Die Direktive stellt sicher, dass Ihr Verbund GraphQL-Schema ist entsprechend für Apollo Federation konfiguriert. Dieser Ansatz verbessert die Objekttypverwaltung und ermöglicht eine dienstübergreifende Entitätsauflösung.

Konfigurieren Sie Ihren GraphQL-Server mit HotChocolate und verwenden Sie Anweisungen wie @Schlüssel vereinfacht den Aufbau großer, verteilter APIs. Mit dieser Strategie können Sie Ihre Dienste einfacher erweitern und gleichzeitig ein konsistentes, leistungsstarkes Schema-Stitching beibehalten.

Referenzen und Ressourcen für HotChocolate und Apollo Federation
  1. Erläutert die Verwendung des @Schlüssel Direktive in Apollo Federation und wie sie in HotChocolate integriert wird. Weitere Einzelheiten finden Sie in der offiziellen HotChocolate-Dokumentation unter HotChocolate-Dokumente .
  2. Bietet einen Überblick über die Konfiguration von GraphQL mit Apollo Federation mithilfe von HotChocolate. Siehe diesen Leitfaden von Dokumente der Apollo-Föderation für weitere Informationen.
  3. Bietet ein detailliertes Beispiel für die Dienstregistrierung und Abfrageauflösung in GraphQL mit HotChocolate. Mehr dazu finden Sie in diesem Artikel Service-Integrationen mit HotChocolate .