Vertical Slice Architecture
Organiza el código por feature en lugar de por capa: cada slice contiene Web + App + Domain + Infra de una funcionalidad.
Contexto
En arquitecturas en capas, agregar una feature obliga a tocar 5 carpetas distintas. La cohesión está rota.
Solución
Cada feature se organiza en su propia carpeta y contiene TODO lo que necesita: endpoint, validador, handler, query, eventos.
Features/
├── Orders.Place/
│ ├── PlaceOrderCommand.cs
│ ├── PlaceOrderHandler.cs
│ ├── PlaceOrderValidator.cs
│ └── PlaceOrderEndpoint.cs
└── Orders.Cancel/
├── CancelOrderCommand.cs
├── CancelOrderHandler.cs
└── CancelOrderEndpoint.cs
#Ejemplo en C#
// Features/Orders.Place/PlaceOrderEndpoint.cs
public class PlaceOrderEndpoint
{
public static void Map(IEndpointRouteBuilder app) =>
app.MapPost("/orders", async (PlaceOrderCommand cmd, IMediator m) =>
Results.Ok(await m.Send(cmd)));
}
public record PlaceOrderCommand(Guid CustomerId, decimal Total) : IRequest<Guid>;
public class PlaceOrderValidator : AbstractValidator<PlaceOrderCommand>
{
public PlaceOrderValidator() => RuleFor(x => x.Total).GreaterThan(0);
}
public class PlaceOrderHandler : IRequestHandler<PlaceOrderCommand, Guid>
{
public Task<Guid> Handle(PlaceOrderCommand req, CancellationToken ct) => /* ... */;
}Cuándo NO aplicarlo
- Cuando hay enormes invariantes de dominio que cruzan slices: necesitas un dominio explícito (Clean / DDD).
Tradeoffs
| Pro | Contra |
|---|---|
| Alta cohesión por feature | Riesgo de duplicar código entre slices |
| Onboarding rápido | Sin disciplina, las features se enredan |
#architecture #feature-folder