Ответ
В последнем проекте использовали стек на основе .NET Core 6, ASP.NET Core для бекенда, Entity Framework Core для работы с БД (PostgreSQL). На фронте — React с TypeScript. Для CI/CD — Azure DevOps, Docker + Kubernetes для деплоя.
Пример кода API-контроллера:
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)
{
var user = await _userService.GetByIdAsync(id);
return user != null ? Ok(user) : NotFound();
}
}
Дополнительно: SignalR для real-time, Redis для кэширования, xUnit для тестов.
Ответ 18+ 🔞
Да ты посмотри, какой стек собрали — прямо как в хорошем борще, всего намешали, но в итоге вкусно вышло. На бекенде, ясное дело, .NET Core 6, потому что на старье уже только бабки в конторе сидят. ASP.NET Core — ну куда ж без него, чтобы эти REST'овские штуки по воздуху летали. С базой — PostgreSQL, потому что MySQL это уже как-то девяностые пахнет, а Entity Framework Core сверху, чтобы не писать эти километровые SQL'ные запросы, а то с ума сойти можно.
Фронт — React с TypeScript, ну а че, все сейчас так делают, чтобы эти интерфейсы не разваливались от чиха. TypeScript — это вообще спасение, иначе там в JavaScript'е такой пиздец творится, что к вечеру уже не понимаешь, что у тебя в переменной лежит: строка, число или целый ёбаный массив.
А вот дальше начинается магия, блядь. CI/CD на Azure DevOps — залил код, а он сам себе собирает, тестирует и даже на сервак выкатывает, красота! Деплой — Docker с Kubernetes, это когда твоё приложение засовывают в контейнер, как селёдку в банку, а потом эти банки по кластеру раскидывают, чтобы если одна сдохла, остальные работали. Умно, чо.
Смотри, какой контроллер симпатичный написали:
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)
{
var user = await _userService.GetByIdAsync(id);
return user != null ? Ok(user) : NotFound();
}
}
Всё чётко, без лишней воды: пришёл запрос — отдал пользователя, нет пользователя — отдал 404, иди лесом. Dependency Injection на месте, async/await — чтобы всё летало, а не тормозило как телега.
А ещё, представляешь, SignalR для real-time'а прикрутили — чтобы уведомления летели мгновенно, без этих дурацких обновлений страницы. Redis для кэша — чтобы базу не ебать по каждому чиху, особенно когда один и тот же запрос тысячу раз дергают. Ну и тесты на xUnit, потому что без них как без рук — напишешь фичу, а она всё ломает, потом ночами сидишь и хуяришь, как дурак.
В общем, стек получился крепкий, на века. Только смотри, не перегрузи его своими костылями, а то потом разгребать этот код будет — просто пиздец, а не работа.