ApolloGraphQL.HotChocolate.Federation
0.0.2
Prefix Reserved
See the version list below for details.
dotnet add package ApolloGraphQL.HotChocolate.Federation --version 0.0.2
NuGet\Install-Package ApolloGraphQL.HotChocolate.Federation -Version 0.0.2
<PackageReference Include="ApolloGraphQL.HotChocolate.Federation" Version="0.0.2" />
<PackageVersion Include="ApolloGraphQL.HotChocolate.Federation" Version="0.0.2" />
<PackageReference Include="ApolloGraphQL.HotChocolate.Federation" />
paket add ApolloGraphQL.HotChocolate.Federation --version 0.0.2
#r "nuget: ApolloGraphQL.HotChocolate.Federation, 0.0.2"
#:package ApolloGraphQL.HotChocolate.Federation@0.0.2
#addin nuget:?package=ApolloGraphQL.HotChocolate.Federation&version=0.0.2
#tool nuget:?package=ApolloGraphQL.HotChocolate.Federation&version=0.0.2
Apollo Federation for Hot Chocolate
This is a fork of
HotChocolate.Federationmodule that aims to provide first class Apollo Federation support forHotChocolatesubgraphs.
Apollo Federation is a powerful, open architecture that helps you create a unified supergraph that combines multiple GraphQL APIs.
ApolloGraphQL.HotChocolate.Federation provides Apollo Federation support for building subgraphs in the HotChocolate ecosystem. Individual subgraphs can be run independently of each other but can also specify
relationships to the other subgraphs by using Federated directives. See Apollo Federation documentation for details.
Installation
ApolloGraphQL.HotChocolate.Federation package is published to Nuget. Update your .csproj file with following package references
<ItemGroup>
<PackageReference Include="HotChocolate.AspNetCore" Version="13.5.1" />
<PackageReference Include="ApolloGraphQL.HotChocolate.Federation" Version="$LatestVersion" />
</ItemGroup>
After installing the necessary packages, you need to register Apollo Federation with your GraphQL service.
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddGraphQLServer()
.AddApolloFederation()
// register your types and services
;
var app = builder.Build();
app.MapGraphQL();
app.Run();
Usage
Refer to HotChocolate documentation for detailed information on how to create GraphQL schemas and configure your server.
Apollo Federation requires subgraphs to provide some additional metadata to make them supergraph aware. Entities are GraphQL objects that can be uniquely identified across
the supergraph by the specified @keys. Since entities can be extended by various subgraphs, we need an extra entry point to access the entities, i.e. subgraphs need to
implement reference resolvers for entities that they support.
Currently ApolloGraphQL.HotChocolate.Federation supports only Apollo Federation v1. See Apollo documentation for additional Federation details.
Annotation
All federated directives are provided as attributes that can be applied directly on classes/fields/methods.
[Key("id")]
public class Product
{
public Product(string id, string name, string? description)
{
Id = id;
Name = name;
Description = description;
}
[ID]
public string Id { get; }
public string Name { get; }
public string? Description { get; }
// assumes ProductRepository with GetById method exists
// reference resolver method must be public static
[ReferenceResolver]
public static Product GetByIdAsync(
string id,
ProductRepository productRepository)
=> productRepository.GetById(id);
}
This will generate following type
type Product @key(fields: "id") {
id: ID!
name: String!
description: String
}
Federation Attributes
Directives
Keyapplicable on objects, see@keydocumentationExtendsapplicable on objects, see@extendsdocumentationExternalapplicable on fields, see@externaldocumentationProvidesapplicable on fields, see@providesdocumentationRequiresapplicable on fields, see@requiresdocumentation
Entity resolution
Mapapplicable on entity resolver method paramaters, allows you to map complex argument to a simpler representation value, e.g.[Map("foo.bar")] string barReferenceResolverapplicable on static public methods to indicate entity resolver
Code First
Alternatively, if you need more granular control, you can use code first approach and manually populate federation information on the underlying GraphQL type descriptor. All federated directives expose corresponding methods on the applicable descriptor.
public class Product
{
public Product(string id, string name, string? description)
{
Id = id;
Name = name;
Description = description;
}
[ID]
public string Id { get; }
public string Name { get; }
public string? Description { get; }
}
public class ProductType : ObjectType<Product>
{
protected override void Configure(IObjectTypeDescriptor<Product> descriptor)
{
descriptor
.Key("id")
.ResolveReferenceWith(t => GetProduct(default!, default!));
}
private static Product GetProduct(
string id,
ProductRepository productRepository)
=> productRepository.GetById(upc);
}
This will generate following type
type Product @key(fields: "id") {
id: ID!
name: String!
description: String
}
Contact
If you have a specific question about the library or code, please start a discussion in the Apollo community forums or start a conversation on our Discord server.
Contributing
To get started, please fork the repo and checkout a new branch. You can then build the library locally by running
# install dependencies
dotnet restore
# build project
dotnet build
# run tests
dotnet test
See more info in CONTRIBUTING.md.
After you have your local branch set up, take a look at our open issues to see where you can contribute.
Security
For more info on how to contact the team for security issues, see our Security Policy.
License
This library is licensed under The MIT License (MIT).
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- HotChocolate (>= 13.5.1)
-
net7.0
- HotChocolate (>= 13.5.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.