Layered (N-Tier)
Organizes the application into layers with unidirectional dependencies: Presentation → Application → Domain → Infrastructure.
The default organization for most business applications. Each layer has a clear responsibility.
Without rules, everything ends up in the controller or a God Service.
Layers with dependencies only downwards:
Presentation → Application → Domain → Infrastructure
In Clean Architecture, the direction is inverted: Infrastructure depends on the Domain (Dependency Inversion).
#Example in C# — projects
Solution/
├── MyApp.Web ← Controllers / Razor / Minimal API
├── MyApp.Application ← Use cases (Commands, Queries)
├── MyApp.Domain ← Entities, value objects, rules
└── MyApp.Infrastructure ← EF Core, HTTP clients, repositories
// Domain
public class Order { public Guid Id { get; } public void Confirm() { /* invariants */ } }
// Application
public record ConfirmOrderCommand(Guid Id);
public class ConfirmOrderHandler { /* orchestrates domain + repository */ }
// Infrastructure
public class EfOrderRepository : IOrderRepository { /* persistence */ }
// Web
[ApiController] public class OrdersController : ControllerBase { /* delegates to Application */ }#The underlying problem
In classic Layered, dependencies go all the way down to the data layer: the domain ends up depending on infrastructure. That is the motivation for Hexagonal, Onion and Clean, which reverse that direction. If your business logic is simple, Layered is enough and perfectly valid; see the comparison.
- For small microservices: a layer might be superfluous.
- When the team abuses "anemic domain": layers become flat CRUD.
#architecture #layered