Контроллеры и Minimal API: когда что
↑ 3.3 Web API: контроллеры, Minimal API, валидация · → Следующая
Зачем это на собесе
Вопрос на архитектурное мышление: «Minimal API или контроллеры?» — важно назвать критерии, а не «что нравится».
Объяснение
| Критерий | Контроллеры (MVC) | Minimal API |
|---|---|---|
| Структура | классы, атрибуты, [ApiController] | лямбды/методы, MapGet/Post… |
| Фильтры | action/resource/exception/result | endpoint 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.
Практика
- Реализуйте один и тот же CRUD в двух стилях и сравните объём кода.
- Вынесите endpoint-ы в extension-метод
MapXxx. - Сравните throughput через
bombardierили k6.
Вопросы с ответами
Когда выбрать Minimal API?
Для небольших сервисов и когда важны скорость старта/AOT; с группировкой (
MapGroup) подходит и для больших.
Что делает атрибут ApiController?
Автоматическая валидация модели с ответом 400, вывод источников binding, ProblemDetails, обязательность атрибутного роутинга.
Чем отличается ControllerBase от Controller?
Controllerдобавляет поддержку View; для API достаточноControllerBase.