QRShop is an ongoing .NET portfolio project designed to explore clean, maintainable, and scalable application design.
It serves as a sandbox for implementing production-grade concepts such as Domain Events, Vertical Slice Architecture, and asynchronous messaging with RabbitMQ (future implementation).
To visualize and interact with this backend, a corresponding frontend has been implemented using Next.js: nextjs-qrshop.
Additionally, a demo version of the project is available, as described in the Demo section below.
The project is still in active development, with multiple open issues reflecting ongoing improvements and planned features.
- .NET 9 / C#
- Entity Framework Core — ORM and migrations
- PostgreSQL — primary database
- Docker & Docker Compose — containerization and local orchestration
- xUnit — testing framework
- GitHub Actions — CI/CD pipeline
- (Planned) RabbitMQ — message-based communication
- (Planned) Redis — distributed caching
QRShop follows a Vertical Slice Architecture (feature-based design), focusing on organizing code by behavior rather than technical layers.
Features/– Core business use cases, each encapsulating commands, queries, and handlersDomains/– Domain models and business logicInfrastructure/– Database, external services, and persistence setupCommon/andAbstractions/– Shared utilities, base classes, and abstractionsServices/– Supporting application services and cross-cutting concerns
- Domain Events – to decouple domain logic and react to business changes
- Output Pattern – standardizing responses and error handling
This approach enhances modularity and testability while keeping the system extensible.
A GitHub Actions workflow automatically builds, tests, and publishes a public Docker image for QRShop.
This enables fast demo setup and continuous delivery of new versions.
You can quickly spin up a demo instance of QRShop using the provided scripts — no manual setup required.
Windows:
powershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/dlopes-se/dotnet-qrshop/main/scripts/run-qrshop.ps1 | iex"macOS / Linux:
bash <(curl -fsSL https://raw.githubusercontent.com/dlopes-se/dotnet-qrshop/main/scripts/run-qrshop.sh) (not tested)
These scripts automatically download and run the latest Docker image published by the CI/CD pipeline.
- Integrate RabbitMQ for event-driven workflows
- Add Redis caching layer
- Implement Domain Events pattern
- Finalize Output Pattern
- Expand test coverage (unit + integration)
- Extend CI/CD workflow (linting, static analysis)
This part of the document describes some ideas for features and business rules for the e-commerce system (built with .NET 9 and (e.g.) Rust as feature flag provider).
- Goal: Safely remove products from catalog while handling large numbers of users and orders.
- Challenges:
- Products may exist in millions of carts or checkouts.
- Need to maintain integrity of historical orders.
- Approach:
- Introduce a retirement status (
Active,Retired,Archived) instead of hard deletes. - Allow retired products to remain in historical orders but prevent new carts/checkouts from adding them.
- Add background job to purge carts that contain retired products (optional cleanup).
- Introduce a retirement status (
- Business Rule:
- Retired products → visible in history, hidden from shop, not addable to cart.
- Goal: Control system features dynamically without redeployments.
- Provider: Rust microservice exposing
/flagsendpoint (database-backed). - .NET Consumer:
- Implement
RustFeatureProviderthat calls Rust service. - Cache results locally with refresh interval (30–60 seconds).
- Implement
- Examples:
product_removal→ enable/disable product retirement.discount_engine→ toggle new pricing logic.
- Future Enhancements:
- Role-based or user-segment targeting.
- Percentage rollouts (canary releases).
- Audit log of feature flag changes.