Skip to content

Repository files navigation

HotChocolate.Demo

Vollstaendiges Demo-Projekt fuer HotChocolate v14 mit .NET 8, das alle wichtigen Konzepte aus der Dokumentation in lauffaehigem Code zeigt.

Aufbau

HotChocolate.Demo/
├─ Domain/                   ← reine Modelle, keine Framework-Abhaengigkeiten
│  ├─ Book.cs
│  ├─ Author.cs
│  └─ DomainExceptions.cs
├─ Data/                     ← EF Core Persistence
│  ├─ LibraryDbContext.cs
│  └─ DatabaseSeeder.cs
├─ Application/              ← Use-Cases / Business-Logik
│  ├─ BookService.cs
│  └─ AuthorService.cs
├─ GraphQL/                  ← GraphQL-spezifisch, kennt Domain + Application
│  ├─ Query.cs
│  ├─ Mutation.cs
│  ├─ Subscription.cs
│  ├─ DomainErrorFilter.cs
│  ├─ Types/
│  │  ├─ BookType.cs
│  │  └─ AuthorType.cs
│  ├─ Inputs/
│  │  └─ BookInputs.cs
│  ├─ Payloads/
│  │  └─ BookPayloads.cs
│  └─ DataLoaders/
│     └─ AuthorByIdDataLoader.cs
├─ Program.cs                ← DI, Middleware, GraphQL-Server-Setup
├─ appsettings.json
└─ Examples.graphql          ← Beispiel-Queries fuer Banana Cake Pop

Lokal starten

dotnet restore
dotnet run

Anschliessend im Browser oeffnen:

Gezeigte Konzepte

Konzept Datei(en)
Code-First Schema Types/*.cs
ObjectType mit expliziter Nullability BookType.cs, AuthorType.cs
Queries + Paging + Filter + Sort Query.cs ([UsePaging], [UseFiltering])
Projections (SELECT-Optimierung) Query.cs ([UseProjection])
Mutations mit Input + Payload Mutation.cs + Inputs/, Payloads/
Subscriptions via InMemory-Transport Subscription.cs, Program.cs
DataLoader (Batch gegen N+1) DataLoaders/AuthorByIdDataLoader.cs
GroupedDataLoader BooksByAuthorIdDataLoader
Authentication (JWT) Program.cs
Authorization (Policies) [Authorize(Policy = "...")]
Error-Mapping GraphQL/DomainErrorFilter.cs
Layered Architecture DomainApplicationGraphQL
EF Core via DbContextFactory Program.cs, Services
Query Depth Limit Program.cs (.AddMaxExecutionDepthRule)

Persisted Queries (Production)

Im Program.cs auskommentiert - fuer Production einschalten:

.AddReadOnlyFileSystemQueryStorage("./persisted_queries")
.UsePersistedQueryPipeline()

Sicher gegen Query-Abuse, liebevoll zu deiner Infrastruktur.

Production-Hinweise

  • IncludeExceptionDetails nur in Development
  • MaxExecutionDepthRule an die fachlichen Anforderungen anpassen
  • AllowIntrospection(false) fuer nicht-oeffentliche APIs setzen
  • JWT-Key niemals hardcoded - per IConfiguration + Secret Manager
  • Subscriptions in Production: Redis oder Postgres statt InMemory
  • DataLoader bei allen 1:N Navigationen - nie Lazy Loading in GraphQL!

About

No description or website provided.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages