Контроллеры и Minimal API: когда что

↑ 3.3 Web API: контроллеры, Minimal API, валидация · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Вопрос на архитектурное мышление: «Minimal API или контроллеры?» — важно назвать критерии, а не «что нравится».

Объяснение

КритерийКонтроллеры (MVC)Minimal API
Структураклассы, атрибуты, [ApiController]лямбды/методы, MapGet/Post…
Фильтрыaction/resource/exception/resultendpoint filters
Model binding и валидациябогатые, автоматические 400ближе к ручной; валидацию подключают (.NET 10 — встроенная)
Производительностьчуть больше накладныхбыстрее старт и меньше аллокаций
Совместимостьзрелая экосистемабыстро развивается, AOT-friendly
Подходит длябольшие API с общей логикоймикросервисы, небольшие API, high-load
// Контроллер
[ApiController, Route("orders")]
public class OrdersController(IOrderService svc) : ControllerBase
{
    [HttpGet("{id:guid}")]
    public async Task<ActionResult<OrderDto>> Get(Guid id, CancellationToken ct)
        => await svc.FindAsync(id, ct) is { } dto ? dto : NotFound();
}
 
// Minimal API
var orders = app.MapGroup("/orders").RequireAuthorization();
orders.MapGet("{id:guid}", async (Guid id, IOrderService svc, CancellationToken ct) =>
    await svc.FindAsync(id, ct) is { } dto ? Results.Ok(dto) : Results.NotFound());

Оба подхода можно смешивать в одном приложении. Что бы вы ни выбрали, держите endpoint тонким: разбор запроса → вызов сервиса/обработчика → формирование ответа.

Нюансы и подводные камни

  • Логика в контроллере/лямбде — плохой знак: выносите в сервисы/handlers.
  • [ApiController] включает автоматический 400 при невалидной модели, binding source inference и ProblemDetails.
  • Minimal API с большим числом endpoint без MapGroup превращает Program.cs в свалку.
  • Возврат ActionResult<T> даёт типизацию для OpenAPI.

Практика

  1. Реализуйте один и тот же CRUD в двух стилях и сравните объём кода.
  2. Вынесите endpoint-ы в extension-метод MapXxx.
  3. Сравните throughput через bombardier или k6.

Вопросы с ответами

Связанные темы