Online marktplaats

Mijn meest realistische en uitgebreide leer- en probeeromgeving. Een marktplaats waarop derde partijen zich kunnen registreren en producten kunnen verkopen, gebouwd om techniek- en architectuurkeuzes zoals Clean Architecture, DDD, CQRS en cloudoplossingen in een realistische en productiegerichte context toe te passen en verder te verdiepen.

Online marketplace - main.png

Project informatie

Start
mei 2022
Einde
januari 0001
Complexiteit
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

Over het project

Dit project is mijn meest uitgebreide en realistische leer- en probeeromgeving. Sinds 2022 gebruik ik dit project om nieuwe tools, technieken, architectuurkeuzes en cloudoplossingen in een praktische context toe te passen en te toetsen.

Het platform is opgezet als een marktplaats waarop derde partijen zich kunnen registreren en hun eigen producten kunnen aanbieden en verkopen, inclusief uitgebreide productspecificaties en filtermogelijkheden.

In de afgelopen jaren ben ik twee keer vrijwel volledig opnieuw begonnen, omdat eerdere versies niet meer aansloten bij mijn huidige kennis en inzichten. Elke herstart was daarbij een bewuste keuze om techniek, architectuur en ontwerpprincipes beter te laten aansluiten bij mijn groei als ontwikkelaar.


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

Architectuur

De huidige architectuur is gebaseerd op Clean Architecture in combinatie met CQRS, MediatR en rich domain models. Hiervoor heb ik gekozen omdat dit past bij hoe ik graag werk: duidelijke structuur in de code zonder het onnodig complex te maken, waarbij de codebase testbaar, onderhoudbaar en overzichtelijk blijft.

De domeinlogica is ondergebracht in de domeinmodellen zelf, waarbij business rules en validaties niet in de handlers of services maar in de aggregates zijn geplaatst. Dit sluit aan bij DDD-principes en zorgt ervoor dat de kern van het systeem onafhankelijk blijft van infrastructuur en frameworks.

De verschillende domeinen zijn verder logisch gescheiden, maar nog niet volledig gemodelleerd als expliciete bounded contexts. Een volgende stap in de ontwikkeling van dit project is het verder isoleren van deze domeinen en het explicieter toepassen van Domain Driven Design om complexiteit beter te beheersen naarmate het project groeit.


Infrastructuur

Voor hosting gebruik ik Azure Container Apps. Hiervoor heb ik gekozen omdat ik de kracht van Kubernetes, zoals automatische schaalbaarheid, revisiebeheer en containergebaseerde deployments, wilde benutten zonder zelf een Kubernetes cluster te hoeven beheren.

Eerder heb ik het platform gehost in een Azure Kubernetes cluster om hands-on ervaring op te doen met Kubernetes. Hoewel dit erg leerzaam was, bleek de complexiteit van het beheer in deze fase niet in verhouding te staan tot wat het platform nodig had. Daarom heb ik gekozen voor Azure Container Apps om mijn tijd vooral te besteden aan het product zelf in plaats van aan clusterbeheer.

Voor het beheren van de infrastructuur gebruik ik Pulumi. Dit is een Infrastructure as Code tool waarmee de volledige cloudinfrastructuur in C# kan worden beschreven. Zowel de Kubernetesomgeving als de Azure Container Apps-omgeving zijn hiermee volledig ingericht.


Technische keuzes

• Storefront: ASP.NET Core Razor Pages – voor performance en maximale controle
• Portaal voor beheerders en verkopers: Blazor – voor snelle ontwikkeling en rijke interactie
• Data toegang: Entity Framework Core – voor eenvoud en betrouwbaarheid
• Source control en CI/CD: GitHub
• Hosting: Azure Container Apps
• Infrastructuurbeheer: 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