// the find
phongnguyend/Practical.CleanArchitecture
Full-stack .Net 10 Clean Architecture (Microservices, Modular Monolith, Monolith), Blazor, Angular 21, React 19, Vue 3.5, BFF with YARP, NextJs 16, Domain-Driven Design, CQRS, SOLID, Asp.Net Core Identity Custom Storage, OpenID Connect, EF Core, OpenTelemetry, SignalR, Background Services, Health Checks, Rate Limiting, Clouds (Azure, AWS, GCP), ...
A reference implementation of Clean Architecture patterns in .NET covering monolith, modular monolith, and microservices variants, with five different frontend options (Angular, React, Vue, Blazor, Next.js). Aimed at developers learning architectural patterns or teams wanting a starting point to compare approaches side by side. The repo itself admits it shows multiple ways of doing things, not necessarily best practices.
- Breadth of infrastructure provider coverage is genuinely useful: storage (local/Azure/S3), messaging (RabbitMQ/Kafka/Azure Service Bus/SQS), caching (memory/Redis/SQL), and monitoring (App Insights/OpenTelemetry) are all swappable via config, which makes it practical for comparing cloud options.
- CI/CD setup is thorough: separate GitHub Actions workflows per variant (monolith, modular monolith, microservices), plus CodeQL, Gitleaks secret scanning, dependency scanning, and super-linter — most reference projects skip this entirely.
- Having both Duende IdentityServer and OpenIddict implementations side by side is a real differentiator given Duende's commercial licensing trap, since you can see exactly what changes when migrating.
- End-to-end tests exist with both Selenium and Playwright variants, and API integration tests authenticate via OIDC client credentials — more realistic test coverage than typical tutorial repos.
- The domain model is a thin CRUD wrapper ('ClassifiedAds' with Products/Files/Users). There's almost no actual domain logic, value objects, invariants, or aggregate rules, so the DDD labeling is misleading — it's Clean Architecture layering without meaningful domain modeling.
- Code duplication across the three topology variants (monolith/modular monolith/microservices) is massive and maintained manually. There's no shared core; if a bug exists in one it likely exists in all three, and contributors have to fix it three times.
- The Duende IdentityServer dependency requires a paid production license (currently ~$1500/year for startups), but this is buried in a footnote rather than prominently warned. Someone could build on this and get surprised at go-live.
- Unit test coverage is shallow — the testing pyramid diagrams exist as documentation images, but the actual unit tests are sparse for a repo positioning itself as a quality reference. The 'real' tests are the E2E ones, which inverts the pyramid it preaches.