Start here. This is the direct spoken answer to practice first.
Why this question matters
Vertical slices place the code for one use case close together, while horizontal layers group code by technical role. The better choice depends on what changes together and which rules truly need sharing.
I prefer a slice when a request, its validation, mapping, handler, and tests evolve together. A developer can follow CreateOrder without searching several broad folders, and unrelated features are less likely to share a generic service accidentally. I still keep shared domain rules, infrastructure adapters, and genuine cross-cutting behavior in explicit common boundaries. Vertical slicing is organization, not permission to duplicate invariants.