Before we talk about different ways of enforcing architecture boundaries, let's discuss where the boundaries lie within our architecture and what "enforcing a boundary" actually means:
Figure 10.1: Enforcing architecture boundaries means enforcing that dependencies point in the right direction. Dashed arrows mark dependencies that are not allowed according to our architecture
The preceding figure shows how the elements of our hexagonal architecture might be distributed across four layers resembling the generic clean architecture approach introduced in Chapter 2, Inverting Dependencies.
The innermost layer contains domain entities. The application layer may access those domain entities to implement use cases within application services. Adapters access those services through incoming ports or are being accessed by those services through outgoing ports. Finally, the configuration layer contains factories that create adapter and service...