0001 — DDD strict avec un Core pur
Contexte
Cette app fait circuler de l'argent réel. Les règles métier éparpillées entre les endpoints, les services de fond, et les composants Razor se transforment en comportement non testable et incohérent — exactement où un bug coûte du capital à un utilisateur.
Décision
La logique de domaine vit sur les agrégats, les objets de valeur, et les services de domaine dans src/Core, qui compile avec zéro dépendances infrastructure (pas d'EF, HttpClient, Docker, ou ASP.NET). Les endpoints, les outils MCP, les composants, et les BackgroundServices orchestrent — ils ne décident jamais. Règles :
- Pas de setters publics ; les changements d'état passent par des méthodes révélatrices d'intention qui gardent les invariants.
- Les agrégats se référencent entre eux par ID fort, pas par propriété de navigation.
- Un
SaveChangesmute un agrégat ; les flux inter-agrégats utilisent les événements de domaine. - Les primitives franchissant une frontière de domaine sont enveloppées dans des objets de valeur.
- Les violations d'invariants lèvent une
DomainExceptionCore, pas une exception framework.
Conséquences
- Les règles de domaine sont testables unitairement sans base de données ou hôte web.
- La pureté de
Coreest appliquée par machine parArchitectureGuardTestset échouerait le build si elle était brisée. - Il y a plus de cérémonie (objets de valeur, ID forts, événements de domaine) qu'un modèle anémique — c'est le coût délibéré de garder les règles de circulation d'argent correctes et en un seul endroit.