Aller au contenu

Les concepts

Le projet est développé en suivant les principes du Domain Driven Design. Il utilise en particulier l'Ubiquitous Language, et les termes techniques du métier se retrouvent donc dans le code.

Le code est architecturé selon les principes de la Clean Architecture. Les séparations entre les différentes « couches » sont donc visibles dans l'organisation des modules : domain, use_cases, interfaces et infrastructure. Pour une présentation plus complète, voir la section « architecture ».

La version originale de Listsém présentait comme seule complexité la gestion asynchrone des envois de courriel et d'inscription aux mailing lists. Plutôt que de repartir sur une architecture avec un bus de commande, il a été décidé d'aller un cran plus loin et d'introduire une communication basée sur les évènements. Plutôt que de lire les commandes envoyées, les services de courriel et d'inscriptions aux mailing lists lisent les évènements passés.

La publication de tous les changements d'état du modèle via des évènements a naturellement entrainé la mise en place d'une ségrégation entre les commandes et les requêtes (CQRS).

Il est indéniable que ces choix architecturaux entrainent une (légère) courbe d'apprentissage pour prendre le projet en main, mais la couverture de test permet de commencer à contribuer en étant confiant dans le fait que le système reste stable. De plus, Listsém est à priori un projet simple, et c'est donc un bon candidat pour pratiquer toutes ces techniques sans introduire un trop grand surcoût de développement.

Le modèle (write side en CQRS)

Les agrégats appliquent des règles métiers et émettent des évènements du domaine.

Un agrégat peut être une entité (implémentée par une classe comme Demande) ou un service (implémenté par une « fonction » comme DepotDemande.deposer).

Les projecteurs

Ils interprètent les évènements du domaine et crées des structures (tables dans une base de données…) représentant une « vue » du modèle.

Les requêtes (read side en CQRS)

Elles retournent les informations générées par les projecteurs sous forme de DTO (data transfer object).

Elles peuvent le plus souvent être implémentées avec un ORM.

Les présenteurs

Ils manipulent les données (DTO implémentés par des dataclasses) et les passent aux patrons.

Les patrons (templates)

Ils affichent les données qui leur sont passées dans un format spécifique (HTML, JSON, texte…).

Retour en haut de la page