// the find
dotnet/eShop
A reference .NET application implementing an eCommerce site
Official Microsoft reference application showing how to build a microservices-based eCommerce app with .NET 9 and .NET Aspire. Covers Catalog, Basket, Ordering, Identity, and a MAUI mobile client, all wired together with gRPC, RabbitMQ/EventBus, Redis, and PostgreSQL. Aimed at .NET developers wanting a realistic starting point or architectural patterns to study.
- Uses .NET Aspire for local orchestration, which means one `dotnet run` on the AppHost spins up all services plus infrastructure containers — genuinely good developer experience compared to juggling docker-compose manually
- Shows real patterns in practice: outbox pattern for integration events in Catalog.API, gRPC for the Basket service, EF Core with explicit entity configurations, and Keycloak/OIDC for identity — not toy implementations
- Playwright e2e tests and PR validation workflows are included, so there's at least some automated confidence layer beyond unit tests
- Azure Developer CLI (azd) integration means you can go from local to a real Azure deployment in a few commands, which is useful for teams evaluating production deployment paths
- Unit test coverage is thin to nonexistent for most services — it's a reference app, so the emphasis is on architecture, but anyone trying to use this as a template for production code will need to add significant test infrastructure from scratch
- The MAUI ClientApp still contains mock services (BasketMockService, fake product images) and location/marketing models that appear to be leftover scaffolding from an older version, which muddies the codebase and makes it harder to understand what's actually implemented vs stubbed
- Tight coupling to Microsoft's own cloud tooling (Azure OpenAI, azd, Dev Home) means the 'deploy anywhere' story is weaker than the architecture would suggest — non-Azure deployments require significant extra work
- No explicit saga/process manager for order orchestration; the integration event choreography across services works for the demo but is notoriously hard to reason about at scale, and there's no guidance in the repo on where the pattern breaks down