Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Domain-centric? Why Hexagonal, Onion, and Clean...

Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question

To separate technical from domain code, architectural approaches like Hexagonal or Onion Architecture are currently all the rage. However, discussions about their semantic details and their mapping to the source code structure of software projects are at least equally ubiquitous.

How much abstraction and mapping between architectural concepts is needed? Is persistence metadata in the domain model heresy? Above all: what is the actual goal of the exercise, and: does it have to be so complicated?

We address these and other questions in a theoretical overview and by looking at concrete examples. We discuss the trade-offs of different approaches and how various tools and libraries help us to maintain the intended structural integrity.

Avatar for Oliver Drotbohm

Oliver Drotbohm

October 09, 2025
Tweet

More Decks by Oliver Drotbohm

Other Decks in Programming

Transcript

  1. DOMAIN-CENTRIC? WHY HEXAGONAL, ONION, AND CLEAN ARCHITECTURE ARE ANSWERS TO

    THE WRONG QUESTION — AND WHAT TO ASK INSTEAD Oliver Drotbohm ✉ [email protected]    odrotbohm
  2. Cost of Software  Cost of Change Beck - A

    Daily Practice of Empirical Software Design — https://www.youtube.com/watch?v=yBEcq23OgB4 (2023) Yourdon, Constantine - Structured Design — Fundamentals of a Discipline of Computer Program and Systems Design (1979)
  3. Software design is the act of modeling units of strong

    cohesion, loosely coupled to each other.
  4. "A system is never the sum of its parts, it's

    the product of their interactions." — Russel L. Ackoff
  5. Messaging 3rd party API Database HTTP / REST Adapters Application

    Core Port Port Port Port Port 📂 Adapter   
  6. Business Logic Presentation Business Logic Persistence Adapter / Infrastructure Adapter

    / Infrastructure Layered Architecture Hexagonal- / Onion- Architecture
  7. Business Logic Presentation Business Logic Persistence Adapter / Infrastructure Adapter

    / Infrastructure Layered Architecture Hexagonal- / Onion- Architecture
  8. Controller Service Repository Layered Hexagonal Onion Presentation → Business →

    Persistence Driving Adapter → ← Driven Adapter Port ← Application → Port Infrastructure → ← Infrastructure Application / Domain Spring DI DI
  9.       ✉  ✉ 

    ✉  Infrastructure Infrastructure Domain Domain Domain Application Application Application Infrastructure
  10.         ✉ 

    ✉  ✉    Infrastructure Infrastructure Domain Domain Domain Application Application Application Infrastructure
  11. Module Module Module       

     ✉  ✉  ✉    https://odrotbohm.de/2023/07/sliced-onion-architecture
  12. app.web app.service app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository Classic Layers

    CustomerController CustomerService CustomerServiceImpl CustomerRepository JdbcCustomerRepository Low cohesion! !
  13. Classic Layers app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.service OrderService OrderServiceImpl

    app.web app.service app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository
  14. app.domain app.persistence JdbcOrderRepository Classic Layers Hexagonal / Onion OrderService OrderServiceImpl

    OrderRepository app.web OrderController app.web app.service app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository
  15. app.domain app.persistence Classic Layers Hexagonal / Onion app.web JdbcOrderRepository OrderService

    OrderServiceImpl OrderRepository OrderController app.web app.service app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository CustomerController CustomerService CustomerServiceImpl CustomerRepository JdbcCustomerRepository Low cohesion, too! !
  16. app.domain app.persistence app.web Classic Layers Hexagonal / Onion app.web app.service

    app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository JdbcOrderRepository OrderService OrderServiceImpl OrderRepository OrderController
  17. app.domain app.persistence app.web Classic Layers Hexagonal / Onion app.orders OrderService

    OrderServiceImpl OrderRepository OrderController JdbcOrderRepository Modular app.web app.service app.persistence OrderController OrderService OrderServiceImpl OrderRepository JdbcOrderRepository JdbcOrderRepository OrderService OrderServiceImpl OrderRepository OrderController
  18. Classic Layers Hexagonal / Onion Modular app.web OrderController app.service OrderService

    OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository
  19. Classic Layers Hexagonal / Onion Modular app.customer CustomerService CustomerServiceImpl CustomerRepository

    CustomerController JdbcCustomerRepository app.web OrderController app.service OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository
  20. app.web OrderController app.service OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository Classic Layers

    Hexagonal / Onion Modular app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository app.customer CustomerService CustomerServiceImpl CustomerRepository CustomerController JdbcCustomerRepository
  21. Classic Layers Hexagonal / Onion    ✉ 

     Infrastructure Domain Application Modular app.web OrderController app.service OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository
  22. Module    ✉   Classic Layers Hexagonal

    / Onion Modular app.web OrderController app.service OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository
  23. app.customer OrderController JdbcOperations " # Classic Layers Hexagonal / Onion

    Modular Avoid internal complexity if domain permits app.web OrderController app.service OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.domain OrderService OrderServiceImpl app.persistence OrderRepository JdbcOrderRepository app.web OrderController app.orders OrderService OrderServiceImpl OrderRepository OrderController JdbcOrderRepository