E-commerce marketplace

My most realistic and extensive learning and experimentation environment. A marketplace where third parties can register and sell products, built to apply and further deepen technical and architectural choices such as Clean Architecture, DDD, CQRS and cloud solutions in a realistic, production oriented context.

Online marketplace - main.png

Project info

Start
May 2022
End
January 0001
Complexity
8 / 10
[[Team size]]
1
Type
E-commerce
[[Stack]]
C# TypeScript YAML HTML & CSS SQL Javascript Blazor WASM ASP.NET Core RazorPages Entity Framework Core xUnit / NUnit MudBlazor GIT Azure Kubernetes Pulumi Postman Linux Docker CI/CD
[[Live]]
https://test.pekkie.nl

About the project

This project is my most extensive and realistic learning and experimentation environment. Since 2022, I have been using it to apply and test new tools, techniques, architectural approaches and cloud solutions in a practical context.

The platform is set up as a marketplace where third parties can register and offer their own products for sale, including extensive product specifications and filtering options.

Over the past few years, I have restarted the project almost completely twice, because earlier versions no longer aligned with my current knowledge and insights. Each restart was a conscious decision to realign the technology, architecture and design principles with my growth as a developer.


frontend-screenshot-Home_1.png
frontend-screenshot-Catalog_1.png
frontend-screenshot-ProductPage_1.png
frontend-screenshot-ShoppingCart_1.png
frontend-screenshot-AddProduct_1.png

Architecture

The current architecture is based on Clean Architecture in combination with CQRS, MediatR and rich domain models. I chose this approach because it fits the way I prefer to work: clear structure in the code without making it unnecessarily complex, while keeping the codebase testable, maintainable and well structured.

Domain logic is placed within the domain models themselves, where business rules and validations are implemented in the aggregates rather than in handlers or services. This aligns with DDD principles and ensures that the core of the system remains independent from infrastructure and frameworks.

The different domains are logically separated, but not yet fully modeled as explicit bounded contexts. A next step in the evolution of this project is to further isolate these domains and apply Domain Driven Design more explicitly to better manage complexity as the platform grows.


Infrastructure

For hosting, I use Azure Container Apps. I chose this because I wanted the strengths of Kubernetes, such as automatic scaling, revision management and container based deployments, without having to manage a full Kubernetes cluster myself.

Previously, I hosted the platform in an Azure Kubernetes cluster to gain hands on experience with Kubernetes. Although this was very educational, the complexity of managing the cluster at this stage was not proportional to what the platform actually required. For that reason, I moved to Azure Container Apps so I could spend more time on the product itself rather than on cluster management.

For infrastructure management, I use Pulumi. This is an Infrastructure as Code tool that allows the entire cloud environment to be defined in C#. Both the Kubernetes environment and the Azure Container Apps environment have been fully provisioned using this approach.


Technical choices

• Storefront: ASP.NET Core Razor Pages – for performance and maximum control
• Admin and vendor portal: Blazor – for rapid development and rich interaction
• Data access: Entity Framework Core – for simplicity and reliability
• Source control and CI/CD: GitHub
• Hosting: Azure Container Apps
• Infrastructure management: Pulumi

Solution-diagram.png
Solution-screenshot-high-overview.png
Solution-screenshot-storefront.png
Solution-screenshot-portal.png
Solution-screenshot-backend-API.png
Solution-screenshot-backend-application.png
Solution-screenshot-cloud-infra.png