Skip to main content

Clean / Hexagonal Architecture — Dependencies Point Inward

Business logic has zero dependencies on infrastructure. Frameworks, ORMs, and HTTP live outside the domain.

When to use

  • Apps that need swappable infrastructure (swap DB, messaging, HTTP without touching domain)
  • Maximizing testability of business logic in isolation

Tradeoffs

  • More interfaces and indirection (verbose wiring)
  • Over-engineered for simple CRUD apps
// domain/order.go — zero framework imports
package domain

type OrderRepo interface {
Save(o Order) error
FindByID(id string) (Order, error)
}

type PlaceOrderUseCase struct{ repo OrderRepo }

func (uc *PlaceOrderUseCase) Execute(cmd PlaceOrderCmd) error {
order := NewOrder(cmd.CustomerID, cmd.Items)
return uc.repo.Save(order)
}

Gotcha: If your domain layer imports a framework, an ORM, or an HTTP package — it's not Clean Architecture.