13726
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика Связь: @devmangx РКН: https://clck.ru/3FocB6
Думаешь, хорошо разбираешься в ASP.NET Core middleware?
Этот пост поменяет твой взгляд на перехват HTTP-запросов
Middleware в ASP.NET Core — это компонент, участвующий в конвейере обработки HTTP-запросов и ответов.
Есть три подхода: на делегатах (inline), по соглашению (класс), и через IMiddleware для кастомной логики.
1️⃣Сначала можно использовать метод Use напрямую в конфигурации WebApplication.
Такое middleware на основе делегата выполняется до и после следующего компонента в конвейере.
2️⃣Если логика растёт — вынеси её в отдельный класс middleware по соглашению.
Класс должен иметь конструктор с RequestDelegate и метод InvokeAsync.
3️⃣Либо реализуй интерфейс IMiddleware — это более безопасный, проверяемый компилятором способ.
Зарегистрируй класс IMiddleware в DI-контейнере, и фреймворк сам будет его разрешать.
Но есть важные нюансы:
> Middleware по умолчанию живёт как singleton, поэтому внедряй только singleton-зависимости.
> Если нужны scoped-сервисы — передавай их через параметры InvokeAsync в middleware по соглашению.
Кастомные middleware используют для:
• логирования
• авторизации
• валидации
• модификации ответов
Какой подход к middleware ты используешь и почему? Напиши в комментах 😎
👉 @KodBlog
👨💻 Эти каналы реально помогают в изучении программирования и IT
Не веришь? Проверь сам:
👩💻 Easy GitHub — лучшие репозитории с гитхаба для практики и освоения IT.
🌐 Easy WebDev — всё про Frontend, Backend и сопутствующие технологии.
🖥 Easy Python — лёгкое изучение самого универсального языка в мире.
🔠 Easy InfoSec — ИБ, хакинг, OSINT, анонимность, пентест и многое другое.
🖥 Easy Coder — а здесь вообще про всё, что нужно знать для работы в IT.
🖱 Просто выбери нужное и получай топовые материалы каждый день!Читать полностью…
Прекрати усложнять CQRS
> Тебе не нужны библиотеки
> Не нужны десятки слоёв
> Не нужны магические абстракции
Как должен работать CQRS:
> Query — просто запрос данных
> Command — просто инструкция изменить что-то
> Handler — просто код, который делает нужную работу
Ты можешь:
✅ Написать свои IQueryHandler / ICommandHandler
✅Собрать простой pipeline с декораторами (логгинг, валидация)
✅Сохранить полный контроль над связями
CQRS работает лучше всего, когда он простой и явный.
Большинство реализаций ломаются, потому что начинают гнаться за ненужной сложностью.
Читать статью: тык
👉 @KodBlog
Срочные новости в .NET 10 Preview 4
Теперь можно запускать C#-файлы без создания проекта
Команда .NET представила отличное нововведение — file-based apps.
Теперь можно напрямую запускать один .cs-файл командой:
dotnet run Program.cs
.csproj#r "nuget: Humanizer, 2.14.1"
#sdk "Microsoft.NET.Sdk.Web"
#property LangVersion preview
dotnet project convert Program.cs
Как автоматически регистрировать Minimal API в ASP.NET Core
Регистрировать Minimal API вручную — работает, но плохо масштабируется.
Хочешь более чистый и автоматизированный подход?
✅ Определи API-модули как static-классы
✅ Используй рефлексию, чтобы найти и зарегистрировать все методы MapEndpoints
✅ Централизуй регистрацию в едином цикле
Преимущества:
> Единая и понятная структура
> Легче разбивать на модули
> Меньше повторяющегося кода
Полный пример с кодом тут: here 🤙
👉 @KodBlog
IServiceScopeFactory vs IServiceProvider — что использовать для создания пользовательских скоупов?
Оба могут создавать скоупы, но ключевой момент в следующем:IServiceProvider.CreateScope() просто получает IServiceScopeFactory и вызывает у него CreateScope()
Так что использование IServiceScopeFactory — более прямой подход.
Обычно пользовательские скоупы нужны, когда вы работаете с root-провайдером.
Вот решение на практике: тык
👉 @KodBlog
𝗛𝘆𝗯𝗿𝗶𝗱𝗖𝗮𝗰𝗵𝗲 в .𝗡𝗘𝗧 𝟵
В .NET 9 появился новый API для кэширования — HybridCache.
Он решает ограничения IMemoryCache и IDistributedCache
Что он предлагает:
> Единый API (и для in-process, и для out-of-process кэша)
> Настраиваемую сериализацию
> Защиту от «штамповки» (stampede protection)
> Очистку кэша по тегам
Метод GetOrCreateAsync проверяет и основной, и вторичный кэш. Если значения нет — вызывает фабрику, сохраняет результат и возвращает его.
Stampede protection означает: на один ключ — только один вызов фабрики одновременно.
Вот как можно начать использовать HybridCache уже сегодня: read 😡
👉 @KodBlog
В .NET 10 снижена «надбавка» за использование IEnumerable с 83% до 10%
В .NET 9 перебор массива через IEnumerable обходился на 83% дороже, чем прямой перебор массива, тогда как в .NET 10 эта разница составила всего 10% 👏
Что думаете?
👉 @KodBlog
Я больше 6 лет работаю с Clean Architecture — и вот почему она мне реально зашла
Самая большая проблема в энтерпрайз-проектах — бардак в структуре.
Каждый делает по-своему:
> Свои слои, свои подходы, свои велосипеды.
> Знания с проекта на проект не переносятся.
Clean Architecture это чинит.
Это не про количество проектов или навороченные паттерны.
Это про направление зависимостей.
> Внутренние слои (domain, application) описывают абстракции.
> Внешние (infrastructure, UI) — их реализуют.
Никогда наоборот.
Вот и всё. Всё остальное — вариации:
> Классические слои: domain / app / infra / web
> Вертикальные срезы по фичам
> Или компоненты, которые сочетают и то, и другое
Любая схема работает, если держаться этого правила.
Что в итоге получаешь:
✅ Модули, которые легко переиспользовать
✅ Понятное разделение, кто за что отвечает
✅ Логика легко покрывается тестами
✅ Новым людям проще влиться
✅ Компоненты слабо связаны — меньше проблем при изменениях
Clean Architecture реально помогает выпускать продуманный, поддерживаемый код. Я ей продолжаю пользоваться — потому что это просто работает.
👉 @KodBlog
Хочешь сделать .NET-приложение более устойчивым?
Вот 4 простые стратегии:
> Retry — повторить попытку после сбоя
> Timeout — прекратить ожидание после тайм-аута
> Fallback — вернуть безопасное значение
> Circuit breaker — заблокировать постоянные сбои
Эти приёмы помогают справляться с временными ошибками и не падать при каждом чихе.
Раньше для этого чаще всего использовали Polly.
🆕 А в .NET 8 появилась новая Microsoft Resilience Library, построенная поверх Polly.
Хочешь разобраться глубже?
Вот как повысить устойчивость твоего приложения > read
👉 @KodBlog
Clean Architecture by Pedro Constantino
Clean Architecture — это не только про принципы, но и про ясную структуру, которая делает проект масштабируемым, тестируемым и удобным в поддержке
> источник
👉 @KodBlog
В ASP.NET 10 появится поддержка Passkey 🥳
Passkey — это новый способ входа в систему без пароля, основанный на стандартах FIDO2/WebAuthn.
Вместо ввода пароля, пользователь подтверждает вход с помощью:
> Face ID или Touch ID (на телефоне или ноутбуке)
> PIN-кода
> внешнего ключа безопасности (например, YubiKey)
👉 @KodBlog
Кэширование решает проблемы кэширования.
А дальше остаются проблемы, которые кэш не решает.
Я использую паттерн Cache-Aside (он же ленивая загрузка) для ускорения API.
Как это работает:
> Если данные есть в кэше → вернуть их
> Если нет → взять из базы данных и положить в кэш
Это происходит, когда:
> Данные ещё не кэшированы
> Кэш истёк или был очищен
Простой способ повысить производительность при чтении.
Вот короткий гайд, как применить это в своём приложении: тут
👉 @KodBlog
Следует ли перестать использовать случайные UUID в .NET?
Традиционные UUID (Guid.NewGuid()) являются случайными — это хорошо для уникальности, но плохо с точки зрения производительности базы данных.
Они вызывают:
> Дорогую переработку индексов
> Плохую производительность при вставке
> Высокую фрагментацию
Поэтому многие разработчики перешли на ULID — 128-битные, сортируемые и по-прежнему уникальные.
Они сохраняют временной порядок, что делает их более дружелюбными к индексам.
Но теперь появилось новое:
✅ Guid.CreateVersion7() в .NET 9
UUID версии 7 упорядочены по времени и совместимы с ULID, без необходимости в сторонних пакетах.
Вы получаете преимущества ULID, но с нативной поддержкой в .NET.
Перейдёте ли вы с ULID на UUID V7? 🤔
👉 @KodBlog
ASP dotnet: кастомный файл инструкций для GitHub Copilot
Создание файла copilot-instructions.md позволяет задать дополнительные инструкции для Copilot, чтобы его ответы были адаптированы под конкретный репозиторий.
Выше — фрагмент текущего файла инструкций для репозитория dotnet/aspnetcore, который был слит менее часа назад.
Эта функция сейчас находится в превью и поддерживается в Copilot Chat для Visual Studio, VS Code и на сайте GitHub. Также поддерживается агентом Copilot для написания кода.
Что думаете? 💪
👉 @KodBlog
Задана задача импортировать JSON-данные, структура которых не соответствует модели. На 1 фото показан один из способов импорта, при котором одно свойство игнорируется, а два столбца переименовываются.
Результаты
> Новая структура JSON
> Она соответствует нашей модели
На втором фото пример кода с использованием библиотеки FluentValidation для применения отдельных правил валидатора или всех правил — это может быть полезно для разных требований, а также при тестировании
Ставь лайк, если пост оказался полезным 💯
👉 @KodBlog
dotnet разработчики, те, кто не использует инструменты для маппинга — как вы вручную мапите объект на объект?
И почему выбрали именно такой подход? 🤔
Я собрал несколько популярных вариантов, начиная с :
> Пример маппинга через extension-методы
> Пример маппинга через конструктор
> Пример маппинга через статический метод:
> Пример маппинга через явный оператор
> Пример маппинга через неявный оператор
👉 @KodBlog
Диаграмма последовательности выполнения запроса в Entity Framework
👉 @KodBlog
Устал вручную одобрять инструменты в agent mode?
Просто включи параметр chat.tools.autoApprove, чтобы все инструменты автоматически подтверждались.
Можно настроить это только для удалённой среды разработки — так ты получаешь удобство и хоть какую-то защиту от потенциально опасных действий.
👉 @KodBlog
В режиме Ask в VScode ты можешь общаться напрямую с экспертами — так называемыми участниками (participants). Например, участник Remote-SSH может ответить на вопросы о разработке по SSH, помочь с настройкой окружения и даже разобраться с ошибками подключения 🤔
👉 @KodBlog
Игра в кальмара: 5 уроков выживания для .NET-разработчиков
Выживание в мире .NET — это не вопрос удачи.
Это вопрос стратегии.
Точно как в «Игре в кальмара», тут важен каждый выбор.
1. ИГРА «КРАСНЫЙ СВЕТ, ЗЕЛЁНЫЙ СВЕТ»
Врываешься в проект без обдуманной архитектуры?
🔴Красный свет.
Закладываешь масштабируемый и надёжный фундамент с самого начала?
🟢Зелёный свет.
Архитектура — твой первый шаг. Не замирай
2. ИГРА «СОТА»
Работа в запутанном коде — как вырезать фигуру из сахарной соты:
одно неловкое движение — и всё трещит по швам.
Пиши чистый, тестируемый код — тогда приложение не развалится под давлением
3. ИГРА «ПЕРЕТЯГИВАНИЕ КАНАТА»
Окружи себя сильными наставниками, коллегами и профессиональными сообществами.
Они помогут вытянуть тебя через самые сложные испытания
4. ИГРА «ШАРИКИ»
Технический долг — как игра в шарики:
кажется, что каждый костыль — мелочь, но они быстро накапливаются.
Если долго их игнорировать — можно проиграть всё.
Грамотное управление долгом удержит тебя в игре.
5. ИГРА «СТЕКЛЯННЫЙ МОСТ»
Учись на чужих ошибках.
Используй проверенные решения и библиотеки.
Не изобретай велосипед
Разработка на .NET — это игра, где важен каждый выбор
Играй с умом 😈
👉 @KodBlog
Вот топовый инструмент от Microsoft
dotnet/interactive — даёт тебе интерактивные ноутбуки с поддержкой C#, F#, PowerShell, SQL и даже JS в одном файле 😮
Можно писать, визуализировать данные, делиться демками и комбинировать языки как угодно.
Работает в Jupyter и VS Code. Подходит для обучения, исследований и просто кайфового кодинга.
Советую заценить — реально мощная штука для .NET-разработчиков
👉 @KodBlog
Как я импортировал более 5 000 000 записей в базу данных:
(за 89 секунд)
Недавно мне нужно было выполнить большую миграцию данных.
После изучения доступных вариантов я выбрал SQLBulkCopy.
SQLBulkCopy позволяет импортировать большие объёмы данных напрямую в таблицы SQL Server.
Также он поддерживает транзакции — можно откатить весь импорт в случае ошибки.
У меня нет бенчмарков, но в моём случае импорт завершился за 89 секунд 💪
P.S. Вы использовали SQLBulkCopy?
👉 @KodBlog
Создание кастомного GPT в ChatGPT может быть крайне полезным.
Например, разработчик хочет заменить SqlClient-операции на Dapper и ему предстоит проделать это множество раз.
С помощью кастомного GPT можно избежать постоянного ввода промптов — достаточно просто вставить код и получить результат.
В этом случае я создал инструкцию в Microsoft Word, сохранил её в PDF и загрузил в кастомного GPT 💪
👉 @KodBlog
Времена жизни (Lifetimes) в .NET DI:
> Singleton — один экземпляр на всё приложение
> Scoped — один экземпляр на каждый запрос
> Transient — новый экземпляр каждый раз при запросе
Важно помнить:
– Нельзя внедрять Scoped/Transient в Singleton — это может привести к утечкам памяти
– Используй Singleton только для безсостояний или потокобезопасных сервисов
👉 @KodBlog
20 идей для пет-проектов на .NET
Хочешь прокачаться — пиши реальные приложения
> Трекер личных финансов
> Трекер привычек
> Журнал тренировок
> To‑Do список
> Дашборд погоды
> Простая блог-платформа
> Мини-соцсеть
> Фото-галерея
> Онлайн-магазин
> Генератор счетов
> Умный подбор рецептов
> Сокращатель ссылок
> Планировщик встреч
> Канбан-доска для команды
> Система управления документами
> Приложение для записи на приём
> Сервис вызова такси
> Сайт для поиска работы
> Сравнение резюме с вакансиями
> Дашборд для умного дома
👉 @KodBlog
99% разработчиков ошибаются в обработке исключений
А вот что делает оставшийся 1%:
Они используют глобальный обработчик исключений.
Начиная с .NET 8, можно создать класс, реализующий IExceptionHandler, чтобы перехватывать все необработанные исключения.
Внутри обработчика можно залогировать исключение и вернуть ProblemDetails клиенту API.
Можно также зарегистрировать несколько реализаций IExceptionHandler — они будут вызываться в порядке регистрации.
Предсказать все исключения невозможно.
Но можно перехватить их все в одном месте.❤️
👉 @KodBlog
Хочешь поднять свой TCP / UDP / WebSocket сервер без ASP.NET?
SuperSocket — фреймворк для .NET с мощной архитектурой
—> TCP, UDP, WebSocket из коробки
—> Свои протоколы через pipeline-фильтры
—> Middleware, сессии, команды, DI, логи
—> Кроссплатформенный, high-perf, MIT
💖
👉 @KodBlog
Часто при создании моделей я сначала пишу их в одном файле, а уже потом с помощью ReSharper быстро раскидываю каждую модель в отдельный файл — буквально в пару кликов мышкой.
Такой подход лично для меня удобнее:
> не нужно сразу прыгать между десятками файлов
> всё видно и правится в одном месте
> а уже потом ReSharper сам всё красиво разносит по файлам
— Гайд: Как ReSharper разносит классы по файлам
👉 @KodBlog
вопрос в том, быть или не быть
отсылка к знаменитой сцене с Гамлетом
👉 @KodBlog