Sådan bruges HotChocolate til at anvende nøgledirektivet på objekttyper i GraphQL

Key Directive

Optimering af objekttyper med nøgledirektiv i varm chokolade

Når du bruger GraphQL med HotChocolate, skal du muligvis udvide dine objekttyper med direktiver, som f.eks. direktiv, for at sikre kompatibilitet med Apollo Federation. Dette er især vigtigt for fødererede skemaer, hvor nøgler identificerer enheder på tværs af flere tjenester. Det er vigtigt at forstå, hvordan du designer dine objekttyper korrekt med disse direktiver.

Denne artikel vil vise, hvordan du bruger at dekorere objekttyper ved hjælp af direktiv. Vi vil også se på særlige eksempler, der bruger C#-kode til at konstruere en simpel klasse og hvordan man ændrer det producerede GraphQL-skema. Vægten vil være på de faktiske handlinger, du kan tage for at skabe denne funktionalitet.

Når du bruger HotChocolate til at konstruere GraphQL-objekttyper, Direktivet anvendes muligvis ikke øjeblikkeligt som forventet. I stedet kan skemaet producere en simpel typestruktur, der mangler kritiske funktioner, der kræves til føderation. Vi gennemgår, hvordan du løser dette, og får dit skema til at fungere som forventet.

Vi vil også dække vigtige konfigurationsopgaver, såsom at ændre din GraphQL-serveropsætning og bruge den rigtige og pakker. Med den korrekte konfiguration kan du nemt anvende direktiver og sikre korrekt skemaføderering for dine tjenester.

Kommando Eksempel på brug
I HotChocolate dekorerer denne kommando en objekttype ved hjælp af direktiv. Den definerer, hvilket felt der skal fungere som typens unikke identifikator, mens den håndterer Apollo Federation.
Når den anvendes på en metode, instruerer denne attribut HotChocolate om at bruge denne metode som en opløsning for fødererede typer. Det tillader hentning af relevante data i fødererede tjenester via eksterne referencer.
Denne kommando konfigurerer Apollo Federation-understøttelsen i HotChocolate GraphQL-serveren. Det er nødvendigt at aktivere fødererede skemafunktioner, såsom direktiv.
Registrerer en service, som f.eks , i GraphQL DI-beholderen. Dette giver dig mulighed for at injicere tjenester direkte i GraphQL-resolveren.
I SDL-modellen specificerer dette direktiv hovednøglefeltet for føderation. For at aktivere løsning af enheder på tværs af tjenester skal objekttyper have direktiv.
Eksekverer asynkront en GraphQL-forespørgsel, der almindeligvis bruges i enhedstests for at sikre, at skemaet og direktiverne, som f.eks. , er korrekt implementeret.
Denne funktion bruges til at injicere afhængigheder såsom lagre eller tjenester i GraphQL-resolvermetodeargumenter, hvilket muliggør hentning af tjenester i HotChocolate.
XUnits enhedstestkommando bruges til at sikre, at visse strenge eller direktiver, som f.eks direktiv, er inkluderet i det genererede GraphQL-skema under tests.

Forståelse af nøgledirektivernes rolle i varm chokolade

Det første script forklarer, hvordan man implementerer direktiv ved hjælp af HotChocolate i C#. Dette script garanterer, at det oprettede GraphQL-skema indeholder @nøgle direktiv for forbund med Apollo Federation. Scriptet starter med at oprette en klasse og tildeling af og [ID] attributter til sine felter. Disse egenskaber er vigtige for at informere HotChocolate om at markere felt som enhedens unikke identifikator. Dette er afgørende, når du opretter en fødereret GraphQL-tjeneste, hvor enheder kan deles på tværs af flere tjenester. Markering af dette felt giver GraphQL-tjenesten mulighed for at løse entiteten i fødererede forespørgsler.

De funktion er også en væsentlig komponent i scriptet. Denne statiske funktion gør det muligt for HotChocolate at løse enheden ved at søge efter objekt i et depot. De er registreret på GraphQL-serveren, og metode henter en forælder ved sin . I bootstrap-koden er instruktion registrerer objekt, som bruges til at udføre GraphQL-forespørgsler.RegisterService tillader at injicere afhængigheder som ParentRepository i GraphQL-resolvere. Dette design forenkler datahentning og bevarer samtidig en klar adskillelse af bekymringer.

Det andet eksempel tager en skema-første tilgang, der bruger GraphQL SDL (Schema Definition Language) til at definere direktiv inden for skemaet. Denne løsning er især effektiv for teams, der allerede er fortrolige med GraphQL's SDL-syntaks. I dette eksempel er @nøgle direktiv anvendes på type, der tydeligt angiver felt som den unikke identifikator. Brug af schema-first giver udviklere mulighed for at have mere kontrol over, hvordan GraphQL-skemaet er bygget og ændre det uden at skulle gå ind i C#-kode, hvilket gør det til en mere fleksibel mulighed for større teams.

Endelig validerer enhedstestkomponenten, at koden fungerer efter hensigten. Ved at bruge xUnit-testrammen, Assert.The Contains kommandoen sikrer, at det resulterende skema inkluderer direktiv. Denne test validerer skemaet for tilstedeværelsen af @nøgle direktiv, der bekræfter, at tjenesten er korrekt konfigureret til føderation. Enhedstest er en bedste praksis til at sikre, at ændringer i dit GraphQL-skema eller resolvermetoder ikke forstyrrer funktionaliteten, især i et fødereret system, hvor flere tjenester skal fungere problemfrit sammen.

Implementering af nøgledirektivet i HotChocolate for GraphQL-objekttyper

Denne løsning bruger C#, HotChocolate og Apollo Federation til at ændre et GraphQL-skema fra backend.

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();
}

Brug af GraphQL Schema Første tilgang til anvendelse af @key-direktivet

Denne løsning bruger skema-først-tilgangen med GraphQL SDL og HotChocolate til at konstruere et brugerdefineret skema med et @key-direktiv.

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 Testing HotChocolate GraphQL med @key-direktiv

Her er en C#-enhedstest, der bruger xUnit-rammerne til at sikre, at HotChocolate-serveren anvender @key-direktivet korrekt i et GraphQL-skema.

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());
    }
}

Forbedring af GraphQL med Apollo Federation og HotChocolate

Brug af GraphQL med HotChocolate i et fødereret miljø kræver velstruktureret skemasætning. Apollo Federation gør det muligt for udviklere at partitionere skemaer på tværs af flere tjenester og samtidig opretholde en ensartet grænseflade. Ved hjælp af direktiv med HotChocolate, kan du angive, hvordan GraphQL-enheder løses på tværs af flere tjenester. Dette gør din API mere modulær og skalerbar, hvilket især er fordelagtigt i store, distribuerede systemer, hvor flere teams kontrollerer forskellige aspekter af GraphQL-skemaet.

I et typisk fødereret skema kan entiteter som f.eks kan eksistere på tværs af mange tjenester. Apollo Federation bruger direktiv til entydigt at identificere en enhed baseret på et specificeret felt, f.eks . HotChocolates support til Apollo Federation sikrer, at din service integreres ubesværet i en større infrastruktur. Ud over at indstille nøgler kan du bruge forbundsdirektiver som f.eks @forlænger eller at administrere datafelter spredt over flere mikrotjenester, hvilket giver større fleksibilitet til din GraphQL-opsætning.

En anden nøglefaktor, når du bruger HotChocolate, er ydeevneoptimering. Overhentning af data er et almindeligt problem med GraphQL API'er, især i fødererede sammenhænge. Brug af de korrekte resolvere, såsom beskrevet i tidligere tilfælde, garanterer, at din API kun leverer de nødvendige data uden overdrevne søgninger. Desuden understøtter HotChocolate avancerede forespørgselsbatching og caching-algoritmer, som kan øge API-svarhastigheder og effektivitet i et fødereret skema.

  1. Hvordan gavner Apollo Federation udviklingen af ​​GraphQL?
  2. Apollo Federation giver dig mulighed for at opdele GraphQL-skemaer i mange tjenester, der hver især er ansvarlige for en sektion af skemaet, men stadig opretholder en konsistent API.
  3. Hvad er direktiv brugt til i HotChocolate?
  4. De direktiv opretter en unik identifikator for en enhed, hvilket gør det muligt at løse det på tværs af flere GraphQL-tjenester.
  5. Kan jeg bruge og egenskaber sammen i HotChocolate?
  6. Ja, den ejendom bruges til forbund, og angiver feltet som en identifikator i skemaet.
  7. Hvad gør gøre i HotChocolate?
  8. Registrerer en tjeneste, såsom et lager, hos GraphQL-serveren, hvilket muliggør afhængighedsinjektion i dine resolvere.
  9. Hvordan tester du GraphQL-skemaer med HotChocolate?
  10. HotChocolate muliggør skematest ved hjælp af enhedstest ved at påkalde skemaet og tjekke for direktiver som f.eks. i det resulterende resultat.

Bruger HotChocolate's direktiv sikrer, at din fødererede er korrekt konfigureret til Apollo Federation. Denne tilgang forbedrer objekttypestyring og giver mulighed for løsning af enheder på tværs af tjenester.

Konfiguration af din GraphQL-server med HotChocolate og brug af direktiver som f.eks forenkler opbygningen af ​​store, distribuerede API'er. Denne strategi gør det muligt for dig at udvide dine tjenester lettere, samtidig med at du opretholder ensartet, højtydende skemasætning.

  1. Uddyber brugen af direktiv i Apollo Federation, og hvordan det integreres med HotChocolate. For flere detaljer henvises til den officielle HotChocolate-dokumentation på HotChocolate Docs .
  2. Giver et overblik over konfiguration af GraphQL med Apollo Federation ved hjælp af HotChocolate. Se denne guide fra Apollo Federation Docs for mere information.
  3. Tilbyder et detaljeret eksempel på serviceregistrering og forespørgselsopløsning i GraphQL ved hjælp af HotChocolate. Mere kan findes i denne artikel om Serviceintegrationer med HotChocolate .