Modules
Vue d'ensemble du systeme modulaire de Place API et communication inter-modules
Modules
Systeme modulaire
Place API organise le code en modules autonomes, chacun representant un contexte metier distinct. Chaque module possede :
- Son propre projet d'implementation (types
internal) - Son propre projet Contracts (types
public: DTOs, commandes, evenements) - Son propre DbContext avec un schema PostgreSQL dedie
- Ses propres features organisees en vertical slices
- Ses propres tests (unitaires et integration)
Modules actuels
| Module | Schema DB | Description |
|---|---|---|
| Identity | identity | Authentification, autorisation, sessions, 2FA, groupes, roles |
| Audit | audit | Tracabilite des actions, diffusion temps reel via SignalR |
| Messaging | messaging | Envoi multicanal (email, SMS, push), suivi de statut |
| Booking | -- | Module a venir (seul le projet Contracts existe) |
Communication inter-modules
Via projets Contracts
Le mecanisme principal de communication est l'utilisation de commandes MediatR definies dans les projets Contracts. Par exemple, le module Identity envoie un email en publiant une SendEmailCommand definie dans Messaging.Contracts :
// Defini dans Messaging.Contracts
public sealed record SendEmailCommand(EmailMessage Message) : IMessagingCommand;
// Utilise depuis le module Identity
await mediator.Send(new SendEmailCommand(new EmailMessage(
To: user.Email,
Subject: "Confirmation",
TemplateName: "confirm-email",
Variables: new Dictionary<string, string> { ["code"] = otpCode })));
Via notifications MediatR
Pour les evenements asynchrones (in-process), les modules utilisent INotification / INotificationHandler :
// Evenement publie par Identity
public record UserLoggedInEvent(Guid UserId) : IDomainEvent;
// Consomme par Audit (ou tout autre module)
internal class OnUserLoggedIn : INotificationHandler<UserLoggedInEvent> { }
Regles strictes
- Un module ne peut jamais referencer le projet d'implementation d'un autre module
- Un module peut referencer le projet
Contractsd'un autre module - Tous les modules referencent
BuildingBlocks(bibliotheque partagee)
Structure type d'un module
ModuleName/
├── ModuleName/ # Implementation (internal)
│ ├── ModuleNameRoot.cs # Classe marqueur pour le scan d'assemblies
│ ├── Constants/ # Constantes du module
│ ├── Entities/ # Modeles de domaine
│ ├── Events/ # Evenements de domaine
│ ├── Errors/ # Types d'erreurs
│ ├── Extensions/ # AddInfrastructure / UseInfrastructure
│ ├── Features/ # Vertical slices (Commands, Queries, Endpoints)
│ ├── Infrastructure/ # Implementations techniques
│ ├── Persistence/ # DbContext, configurations EF, migrations, seeds
│ ├── Services/ # Interfaces de services
│ └── ValueObjects/ # Types valeur immutables
├── ModuleName.Contracts/ # Interface publique
│ ├── Commands/ # Commandes MediatR publiques
│ ├── Events/ # Evenements d'integration
│ ├── Messages/ # DTOs de messages
│ ├── Requests/ # DTOs de requete
│ └── Responses/ # DTOs de reponse
└── tests/
├── IntegrationTest/ # Tests avec Testcontainers + Respawn
└── UnitTest/ # Tests unitaires avec NSubstitute