С какими фреймворками .NET вы работали?

Ответ

В своей практике я активно использовал следующие фреймворки и технологии из экосистемы .NET:

  • .NET Core / .NET 5-8: Для создания кроссплатформенных серверных приложений и сервисов.
  • ASP.NET Core: Включая Web API для построения RESTful сервисов и MVC для веб-приложений с серверным рендерингом.
  • Entity Framework Core: В качестве основного ORM для работы с базами данных, включая миграции, LINQ-запросы и конфигурацию моделей.
  • WPF: Для разработки десктопных приложений под Windows с использованием паттерна MVVM.
  • Xamarin.Forms / .NET MAUI: Для создания кроссплатформенных мобильных приложений.
  • Дополнительные библиотеки:
    • Dapper — для сценариев, требующих максимальной производительности при работе с сырыми SQL-запросами.
    • MediatR — для реализации паттернов CQRS и Mediator внутри приложения, что помогает разделить ответственность.

Пример контроллера ASP.NET Core Web API:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _productService.GetAllAsync();
        return Ok(products);
    }
}

Также имею опыт интеграции .NET-приложений с облачными сервисами (в основном Azure) и построения микросервисной архитектуры с использованием контейнеризации (Docker).

Ответ 18+ 🔞

Да ты посмотри, какой у меня арсенал-то был, блядь! Всё это на реальных проектах вымучил, не на учебниках. Короче, по косточкам разложу.

Ну, основная моя площадка — это, ясное дело, .NET Core, а теперь уже просто .NET 5-8. Ну, то есть всё, что после этой хтонической .NET Framework, которая только под Windows и весит как чугунный мост. А тут — красота: пишешь один раз, а оно бегает где угодно, на линуксе, на чём угодно. Прогресс, ёпта.

На нём сверху, естественно, ASP.NET Core — это ж святое. Если надо быстрые APIшки для фронтенда или мобилок — Web API в помощь, всё RESTful, красиво. Если вдруг классический сайт с серверным рендерингом нужен — MVC, без проблем. Инструмент как молоток, только для веба.

С базами данных, понятное дело, Entity Framework Core — это мой основной конь. Ну, потому что писать эти INSERTы и SELECTы руками в 2024 году — это ж мазохизм чистый. ORM, блядь! Накатал классы, настроил связки, LINQ-запросы красивые, миграции... Жизнь проще некуда. Хотя, признаюсь, иногда, когда запрос такой, что сам чёрт ногу сломит, или производительность прям до микросекунд важна — достаю из рукава Dapper. Эта зверюга сырой SQL хавает как семечки и выплёвывает готовые объекты. Быстрее только голыми руками в базу лезть.

Для десктопа под винду использовал WPF. Ну, старый добрый зверь, с этой вашей привязкой данных, XAML-ем. Паттерн MVVM там, вся эта архитектурная возня, чтобы приложение не превратилось в одно сплошное «полотно-код-бэхайнд.пиздец».

Пытался и мобилки клепать. Брал Xamarin.Forms, а потом и .NET MAUI на пробу. Ну, идея-то охуенная: один раз на C# написал — и на iOS, и на Android. А на практике, блядь... Ну, скажем так, иногда проще было бы два отдельных проекта сделать, чем сражаться с нативными плюшками через эти абстракции. Но для внутренних корпоративных штук, где дизайн не главное — вполне себе.

А ещё я, сука, любитель архитектурных извращений. Поэтому в сложные сервисы тащил MediatR. Ну, эта библиотечка, которая позволяет развести обработку команд и запросов по разным углам. Типа, контроллер получил запрос — кинул в шину команду «Создать продукт», а там уже какой-то отдельный мужик-обработчик её ловит и делает всю грязную работу. Вроде как лишняя сущность, но когда логики дохуя — помогает не запутаться и не превратить сервис в спагетти-монолит.

Вот, например, типичный кусок APIшки, который я наваял бы:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _productService.GetAllAsync();
        return Ok(products);
    }
}

Всё чинно, благородно, зависимость через конструктор, асинхронность. Красота.

Ну и куда же сейчас без облаков и микросервисов, а? Интегрировался с Azure, этими их сервис-басами, хранилищами. А если проект серьёзный — то сразу заворачивал всё в Docker-контейнеры и думал о том, как бы эту пачку сервисов друг с другом подружить, чтобы они не передрались за общие ресурсы. В общем, не скучал.