BuildingBlocks
Bibliotheque partagee - CQRS, validation, EFCore, endpoints, audit, caching et exceptions
BuildingBlocks
Les BuildingBlocks sont la bibliotheque partagee de Place API. Ils fournissent les abstractions et implementations transversales utilisees par tous les modules.
Protection : Les BuildingBlocks ne doivent pas etre modifies sans approbation explicite. Les changements affectent tous les modules. Privilegier les methodes d'extension ou les abstractions au niveau du module.
Core/CQRS
Wrappers fins autour de MediatR pour le pattern CQRS :
ICommand / ICommand<T>
public interface ICommand : ICommand<Unit> { }
public interface ICommand<out T> : IRequest<T>
where T : notnull { }
Represente une operation d'ecriture. Retourne Unit (void) ou un type de resultat.
IQuery<T>
public interface IQuery<out T> : IRequest<T>
where T : notnull { }
Represente une operation de lecture. Retourne toujours un resultat.
ICommandHandler<TCommand, TResponse>
public interface ICommandHandler<in TCommand, TResponse>
: IRequestHandler<TCommand, TResponse>
where TCommand : ICommand<TResponse>
where TResponse : notnull { }
Handler pour les commandes. L'implementation contient la logique metier.
IQueryHandler<TQuery, TResponse>
public interface IQueryHandler<in TQuery, TResponse>
: IRequestHandler<TQuery, TResponse>
where TQuery : IQuery<TResponse>
where TResponse : notnull { }
Handler pour les queries.
Core/Event
Infrastructure d'evenements de domaine :
| Interface | Description |
|---|---|
IDomainEvent | Interface marqueur pour les evenements de domaine |
IHasDomainEvents | Entite qui publie des evenements (DomainEvents, ClearDomainEvents()) |
IIntegrationEvent | Evenement d'integration entre modules |
IEvent | Interface de base pour tous les evenements |
MessageEnvelope | Enveloppe pour les messages avec metadonnees |
IEventMapper / IEventDispatcher
IEventMapper: convertit les evenements de domaine en evenements d'integrationIEventDispatcher: dispatche les evenements via MediatRCompositeEventMapper: combine plusieurs mappers
Core/Model
Abstractions de base pour les entites :
| Type | Description |
|---|---|
IEntity | Interface de base avec Id |
IVersion | Interface de versioning optimiste (long Version) |
Entity | Classe de base pour les entites |
Aggregate | Classe de base pour les aggregats (racine + evenements de domaine) |
Core/Pagination
Interfaces de pagination :
| Type | Description |
|---|---|
IPageList<T> | Liste paginee avec TotalCount, PageNumber, PageSize |
IPageRequest | Requete de pagination (Page, PageSize) |
IPageQuery<T> | Query combinant filtres et pagination |
Web
IMinimalEndpoint
Interface que tous les endpoints doivent implementer :
public interface IMinimalEndpoint
{
IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder);
}
Les endpoints sont decouverts automatiquement au demarrage via scan d'assemblies.
EndpointConfig
Configuration centralisee des endpoints :
public static class EndpointConfig
{
public const string BaseApiPath = "api/v{version:apiVersion}";
public static ApiVersionSet VersionSet { get; private set; }
}
Autres composants Web
| Type | Description |
|---|---|
BaseController | Controleur de base (heritage MVC, peu utilise dans le pattern Minimal API) |
SlugifyParameterTransformer | Transformation des parametres de route en kebab-case |
AppOptions | Options generales de l'application (nom, version) |
Validation
ValidationBehavior<TRequest, TResponse>
Pipeline behavior MediatR qui execute automatiquement les validateurs FluentValidation :
public sealed class ValidationBehavior<TRequest, TResponse>
: IPipelineBehavior<TRequest, TResponse>
where TRequest : class, IRequest<TResponse>
{
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken cancellationToken)
{
_validator = _serviceProvider.GetService<IValidator<TRequest>>();
if (_validator is null)
return await next(cancellationToken);
await _validator.HandleValidationAsync(request);
return await next(cancellationToken);
}
}
Si aucun validateur n'est enregistre pour le type de requete, le behavior passe directement au handler suivant. Sinon, la validation est executee et une exception est levee en cas d'echec.
EFCore
AppDbContextBase
Classe de base pour les DbContext des modules. Fournit les conventions communes.
IDataSeeder / ISeedManager
Interfaces pour le seeding des donnees initiales :
public interface IDataSeeder
{
int Order { get; }
Task SeedAllAsync();
}
Conventions
ToSnakeCaseTables(): conversion des noms de tables et colonnes en snake_caseFilterSoftDeletedProperties(): filtrage automatique des entites soft-deletedConvertEnumsToStrings(): stockage des enums en tant que strings dans la baseAddCustomDbContext<T>(): enregistrement standard d'un DbContext avec PostgreSQLAddDatabaseMigration<T>(): migration automatique au demarrage avec ordonnancement
PostgresOptions
Options de configuration PostgreSQL (connection string).
Auditing
Infrastructure d'audit complete (detaillee dans la section Module Audit) :
| Composant | Description |
|---|---|
AuditHttpMiddleware | Audit automatique de toutes les requetes HTTP |
AuditCommandBehavior | Audit automatique de toutes les commandes MediatR |
AuditEmitter | Emission des evenements via MediatR notifications |
AuditEventV1 | Structure d'un evenement d'audit |
AuditMetrics | Metriques OpenTelemetry |
AuditMaskingService | Masquage de donnees sensibles |
AuditSeverityClassifier | Classification de la severite |
EntityChangeAuditSaveChangesInterceptor | Intercepteur EF Core |
BackgroundJobs
Integration Hangfire pour les taches de fond :
| Composant | Description |
|---|---|
HangfireSettings | Options de configuration Hangfire |
HangfireStorageStartupTask | Tache de demarrage pour la creation du storage |
HangfireAdminDashboardAuthorizationFilter | Filtre d'autorisation pour le dashboard |
IMediatorBackgroundDispatcher | Interface pour dispatcher des commandes MediatR en arriere-plan |
MediatorBackgroundDispatcher | Implementation via Hangfire |
MediatorHangfireBridge | Bridge entre Hangfire et MediatR |
WhitelistSerializationBinder | Binder de serialisation securise |
Caching
Behaviors MediatR pour le cache :
| Composant | Description |
|---|---|
ICacheRequest | Interface marqueur pour les requetes cachees |
IInvalidateCacheRequest | Interface pour l'invalidation de cache |
CachingBehavior | Behavior qui met en cache les resultats |
InvalidateCachingBehavior | Behavior qui invalide le cache |
Utilise EasyCaching (InMemory, Redis prevu).
Exception
Exceptions personnalisees avec typage fort :
| Exception | Description |
|---|---|
AppException | Exception de base de l'application |
BadRequestException | Requete invalide (400) |
NotFoundException | Ressource non trouvee (404) |
ConflictException | Conflit (409) |
InternalServerException | Erreur serveur (500) |
DomainException | Exception de domaine metier |
AggregateNotFoundException | Aggregat non trouve |
CustomException | Exception personnalisee avec code d'erreur |
ProblemDetailsWithCode | Extension de ProblemDetails avec un code d'erreur |
Constants
| Type | Description |
|---|---|
IdentityConstant | Constantes partagees (noms de roles : Admin, User) |
HealthCheck
| Type | Description |
|---|---|
HealthOptions | Options de configuration des health checks |
OpenTelemetryCollector
| Type | Description |
|---|---|
ActivityInfo | Informations sur une activite OpenTelemetry |
CreateActivityInfo | Creation d'activites |
ObservabilityConstant | Constantes d'observabilite |
PersistMessageProcessor
| Type | Description |
|---|---|
MessageDeliveryType | Type de livraison de message (Internal, External) |
Utils
| Type | Description |
|---|---|
ServiceLocator | Localisateur de service (anti-pattern, utilise avec parcimonie) |