FlexiMarket est une solution de microservice e-commerce moderne construite avec ASP.NET Core, implémentant les meilleures pratiques d'architecture logicielle : Clean Architecture, Domain-Driven Design (DDD), CQRS, et les principes SOLID.
FlexiMarket démontre comment construire un système de gestion de commandes e-commerce robuste, scalable et maintenable en appliquant des patterns architecturaux éprouvés. Ce projet sert à la fois de référence et de base solide pour développer des microservices complexes.
- Clean Architecture - Séparation stricte en couches (Domain, Application, Infrastructure, API)
- Domain-Driven Design - Modélisation riche du domaine métier avec agrégats, entités et value objects
- CQRS Pattern - Séparation des commandes (write) et des requêtes (read)
- Event-Driven - Communication asynchrone via domain events
- Repository Pattern - Abstraction de la couche de persistance
- ✅ Single Responsibility - Une classe, une responsabilité
- ✅ Open/Closed - Ouvert à l'extension, fermé à la modification
- ✅ Liskov Substitution - Substitution transparente des abstractions
- ✅ Interface Segregation - Interfaces spécifiques et ciblées
- ✅ Dependency Inversion - Dépendance vers les abstractions
- Création et gestion du cycle de vie des commandes
- Validation multi-étapes avec services externes
- Gestion des stocks et réservations d'inventaire
- Pré-autorisation et capture de paiements
- Gestion des événements de domaine et audit trail
FlexiMarket/
├── src/
│ ├── FlexiMarket.Domain/ # 🎯 Cœur métier
│ │ ├── Entities/ # Agrégats et entités
│ │ │ ├── Order.cs
│ │ │ └── OrderLine.cs
│ │ ├── ValueObjects/ # Objets valeur immuables
│ │ │ ├── Money.cs
│ │ │ ├── Address.cs
│ │ │ └── CustomerId.cs
│ │ ├── Events/ # Événements de domaine
│ │ │ └── OrderEvents.cs
│ │ └── Base/ # Classes de base
│ │ ├── Entity.cs
│ │ ├── AggregateRoot.cs
│ │ └── ValueObject.cs
│ │
│ ├── FlexiMarket.Application/ # 🔧 Use Cases
│ │ ├── UseCases/
│ │ │ ├── Commands/ # Commandes (write)
│ │ │ │ ├── CreateOrderCommand.cs
│ │ │ │ └── SubmitOrderCommand.cs
│ │ │ └── Queries/ # Requêtes (read)
│ │ │ └── GetOrderDetailsQuery.cs
│ │ └── Interfaces/ # Contrats
│ │ ├── ICommand.cs
│ │ ├── IQuery.cs
│ │ └── Repositories/
│ │
│ ├── FlexiMarket.Infrastructure/ # 🔌 Implémentation
│ │ ├── Persistence/ # Base de données
│ │ │ ├── OrderDbContext.cs
│ │ │ └── Repositories/
│ │ ├── Services/ # Services externes
│ │ │ ├── InventoryService.cs
│ │ │ ├── PricingService.cs
│ │ │ └── PaymentService.cs
│ │ └── Messaging/ # Event Bus
│ │ └── RabbitMqEventBus.cs
│ │
│ └── FlexiMarket.API/ # 🌐 API REST
│ ├── Controllers/
│ │ └── OrdersController.cs
│ ├── Program.cs
│ └── appsettings.json
│
├── tests/
│ ├── FlexiMarket.Domain.Tests/
│ ├── FlexiMarket.Application.Tests/
│ └── FlexiMarket.API.Tests/
│
└── docs/
├── architecture.md
└── use-cases.md
- ASP.NET Core 8.0 - Framework web moderne
- Entity Framework Core - ORM pour la persistance
- MediatR - Pattern Mediator pour CQRS
- FluentValidation - Validation des commandes
- AutoMapper - Mapping objet-objet
- SQL Server - Base de données relationnelle
- Redis - Cache distribué
- RabbitMQ - Message broker pour les événements
- MassTransit - Framework de messaging
- xUnit - Framework de tests
- Moq - Mocking framework
- FluentAssertions - Assertions lisibles
- Docker - Conteneurisation
- Docker Compose - Orchestration locale
- Swagger/OpenAPI - Documentation API
- .NET 8.0 SDK
- SQL Server 2019+ ou Docker
- RabbitMQ (optionnel pour les événements)
- Visual Studio 2022 / VS Code / Rider- Cloner le repository
git clone https://github.com/votre-username/fleximarket.git
cd fleximarket- Restaurer les dépendances
dotnet restore- Configurer la base de données
# Mettre à jour la connection string dans appsettings.json
cd src/FlexiMarket.API
dotnet ef database update- Lancer l'application
dotnet run --project src/FlexiMarket.API- Accéder à Swagger
https://localhost:5001/swagger
# Lancer tous les services
docker-compose up -d
# L'API sera disponible sur http://localhost:8080POST /api/orders
Content-Type: application/json
{
"customerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"shippingAddress": {
"street": "123 Rue de la Paix",
"city": "Paris",
"postalCode": "75001",
"country": "France"
}
}POST /api/orders/{orderId}/items
Content-Type: application/json
{
"productId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"quantity": 2,
"unitPrice": {
"amount": 29.99,
"currency": "EUR"
}
}POST /api/orders/{orderId}/submitGET /api/orders/{orderId}dotnet test# Tests unitaires du domaine
dotnet test tests/FlexiMarket.Domain.Tests
# Tests d'intégration
dotnet test tests/FlexiMarket.API.Testsdotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover- Agrégats :
Orderest un agrégat qui contrôleOrderLine - Value Objects :
Money,Address- objets immuables - Domain Events : Communication entre agrégats
- Ubiquitous Language : Vocabulaire métier partagé
- Commands : Modifications d'état via handlers dédiés
- Queries : Lecture optimisée avec DTOs
- Séparation : Modèles write et read différents
- Domain Events :
OrderCreatedEvent,OrderSubmittedEvent - Event Handlers : Traitement asynchrone
- Event Sourcing Ready : Architecture préparée pour l'event sourcing
- ✅ Validation des entrées avec FluentValidation
- ✅ Protection CSRF
- ✅ Rate limiting
- ✅ Authentication JWT (à implémenter)
- ✅ Async/await partout
- ✅ Pagination des résultats
- ✅ Cache Redis pour les lectures
- ✅ Indexation des requêtes fréquentes
- ✅ Respect des principes SOLID
- ✅ Couverture de tests > 80%
- ✅ Code reviews systématiques
- ✅ Analyse statique avec SonarQube
- Architecture de base
- Gestion des commandes
- CQRS Pattern
- Domain Events
- Authentication & Authorization
- API Gateway avec Ocelot
- Service de catalogue produits
- Elasticsearch pour la recherche
- Event Sourcing complet
- Saga Pattern pour les transactions distribuées
- GraphQL API
- Microservices additionnels (Inventory, Payment, Shipping)
Les contributions sont les bienvenues ! Veuillez suivre ces étapes :
- Fork le projet
- Créer une branche feature (
git checkout -b feature/AmazingFeature) - Commit les changements (
git commit -m 'Add AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
- Respecter les conventions de code C#
- Ajouter des tests pour toute nouvelle fonctionnalité
- Mettre à jour la documentation
- S'assurer que tous les tests passent
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
- Votre Nom - Travail initial - YourGitHub
- Inspiration de Clean Architecture par Uncle Bob
- Patterns CQRS de Martin Fowler
- Communauté Domain-Driven Design
- Tous les contributeurs qui ont participé à ce projet
- 📧 Email: support@fleximarket.dev
- 💬 Discord: Rejoindre la communauté
- 🐛 Issues: GitHub Issues
- 📚 Documentation: Wiki
Made with ❤️ by the FlexiMarket Team