Depuis quelques années, quand je découvre un projet je vois régulièrement des répertoires qui s’appellent :
- Application
- Domain
- Infrastructure
Je me suis interrogé sur le sens de ces mots. Est-ce qu’ils sont liés à un pattern en particulier ? J’ai eu des réponses diverses en fonction des projets :
- « C’est une architecture en couches »
- « C’est une architecture hexagonale »
- « C’est une Clean Architecture »
- « On fait du Domain-Driven Design (DDD) »
Quelle est la bonne réponse ? D’où viennent ces mots ? Quel intérêt à les utiliser ou ne pas les utiliser aujourd’hui ? Je me suis documenté sur le sujet et je vous propose un voyage dans le temps pour y voir un peu plus clair.
Annexe : Exemples de code
DDD Sample
Ce repository qui illustrait le Domain-Driven Design, initié vers 2008 par une équipe comprenant Eric Evans, utilise ces mots application / domain / infrastructure :
Dans src/main/java/se/citerus/dddsample, on trouve les répertoires :
. ├── application/ ├── config/ ├── domain/ ├── infrastructure/ └── interfaces/Le répertoire application contient l’interface de programmation du code métier, une fine couche qui orchestre le code métier :
src/main/java/se/citerus/dddsample/application/ ├── ApplicationEvents.java ├── BookingService.java ├── CargoInspectionService.java ├── HandlingEventService.java └── impl/ ├── BookingServiceImpl.java ├── CargoInspectionServiceImpl.java └── HandlingEventServiceImpl.javaDans domain, on trouve les objets et les règles métier, par exemple pour les marchandises (cargo) :
src/main/java/se/citerus/dddsample/domain/model/cargo ├── Cargo.java ├── CargoRepository.java ├── Delivery.java ├── HandlingActivity.java ├── Itinerary.java ├── Leg.java ├── RouteSpecification.java ├── RoutingStatus.java ├── TrackingId.java └── TransportStatus.javaEt le répertoire infrastructure contient le code de persistance et de messaging :
src/main/java/se/citerus/dddsample/infrastructure/ ├── messaging/ │ └── jms/ ├── persistence/ │ └── hibernate/ └── routing/ └── ExternalRoutingService.javaModular Monolith with DDD
Cet autre exemple de Kamil Grzybek utilise des répertoires Application / Domain / Infrastructure dans ses modules, qui correspondent chacun à des bounded contexts :
Vous pouvez inspecter chaque module :