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