Как реализовать Refresh Tokens в 👇
Настоящая сложность не в базовой реализации аутентификации через JWT, а в том, чтобы обеспечить безопасность и хороший пользовательский опыт при истечении срока действия токенов.
Обычно JWT-аутентификация использует два токена:
● Access token — даёт доступ к защищённым ресурсам и живёт недолго (обычно 5–10 минут).
● Короткий срок жизни снижает риски при компрометации.
Refresh token — нужен для получения нового access token без повторного входа пользователя в систему.
Если access token живёт всего несколько минут — пользователь будет постоянно переавторизовываться. Это ужасный UX.
Здесь и вступает в игру refresh token. Он позволяет «тихо» получить новый access token, когда текущий истёк, не требуя логина.
Refresh token, как правило, живёт дольше — от нескольких дней до недель.
Anton Martyniuk рассказал:
🔸 Что такое refresh токены и как они работают
🔸 Как реализовать их в
🔸 Как обеспечить безопасность и соблюдать best practices
🔸 Как отзывать refresh токены, чтобы динамически обновлять права доступа пользователя
Хочешь прокачать безопасность в
👉 @KodBlog
ASP.NET Core
и как отозвать токены пользователя Настоящая сложность не в базовой реализации аутентификации через JWT, а в том, чтобы обеспечить безопасность и хороший пользовательский опыт при истечении срока действия токенов.
Обычно JWT-аутентификация использует два токена:
● Access token — даёт доступ к защищённым ресурсам и живёт недолго (обычно 5–10 минут).
● Короткий срок жизни снижает риски при компрометации.
Refresh token — нужен для получения нового access token без повторного входа пользователя в систему.
Если access token живёт всего несколько минут — пользователь будет постоянно переавторизовываться. Это ужасный UX.
Здесь и вступает в игру refresh token. Он позволяет «тихо» получить новый access token, когда текущий истёк, не требуя логина.
Refresh token, как правило, живёт дольше — от нескольких дней до недель.
Anton Martyniuk рассказал:
ASP.NET Core
Хочешь прокачать безопасность в
ASP.NET Core
по индустриальным стандартам? вот статьяPlease open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3👀2
Как быстро расчистить раздутые API-контроллеры:
Используй метод-инъекцию😨
Это малоизвестная фича в
Для этого используется
Хотя
Когда стоит использовать метод-инъекцию:
🔸 когда сервис используется только в одном экшене
🔸 когда конструктор начинает превращаться в кашу из зависимостей
🔸 когда сервис тяжёлый, и важно контролировать его создание и утилизацию
Да, внедрение через конструктор — это дефолтный подход.
Но метод-инъекция — это удобный инструмент, если ты:
- хочешь придерживаться Single Responsibility Principle
- не хочешь превращать контроллер в свалку зависимостей
👉 @KodBlog
Используй метод-инъекцию
Это малоизвестная фича в
ASP.NET Core
, которая позволяет внедрять зависимости не в конструктор, а напрямую в метод-обработчик.Для этого используется
[FromServices] IYourService
Хотя
[FromServices]
можно и опустить — оно не обязательно.Когда стоит использовать метод-инъекцию:
Да, внедрение через конструктор — это дефолтный подход.
Но метод-инъекция — это удобный инструмент, если ты:
- хочешь придерживаться Single Responsibility Principle
- не хочешь превращать контроллер в свалку зависимостей
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7
C# наконец-то получает дискриминируемые объединения
Ну, возможно?
Появилось новое предложение по добавлению объединений типов (Type Unions) в C#. И это действительно важно.
Почему?
Это открывает нативную поддержку таких конструкций, как
Больше не нужно городить костыли, оборачивать значения или зависеть от сторонних библиотек, чтобы описать функцию, возвращающую успех или ошибку.
Теперь это может измениться.
В предложении описываются нативные union-типы, включая поддержку pattern matching, проверку исчерпывающего перебора (exhaustiveness checks) и другие фичи.
Не хочешь ждать?
Вот как можно реализовать паттерн
Если предпочитаешь бросать исключения — можешь это пропустить.🤵
👉 @KodBlog
Ну, возможно?
Появилось новое предложение по добавлению объединений типов (Type Unions) в C#. И это действительно важно.
Почему?
Это открывает нативную поддержку таких конструкций, как
Result
и Option
.Больше не нужно городить костыли, оборачивать значения или зависеть от сторонних библиотек, чтобы описать функцию, возвращающую успех или ошибку.
Я уже много лет выступаю за использование паттерна Result. Но до сих пор отсутствие поддержки на уровне языка делало его применение неуклюжим.
Теперь это может измениться.
В предложении описываются нативные union-типы, включая поддержку pattern matching, проверку исчерпывающего перебора (exhaustiveness checks) и другие фичи.
Не хочешь ждать?
Вот как можно реализовать паттерн
Result
уже сегодняЕсли предпочитаешь бросать исключения — можешь это пропустить.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Миф о том, что Dapper на 50% быстрее EF Core — это неправда
Ты наверняка слышал, как говорят, что Dapper на 30%, 50% или даже в 2 раза быстрее, чем EF Core?
Это утверждение гуляет повсюду.
Но проведя реальный бенчмарк на .NET 8, с таким запросом:
Результаты удивили:
🔸 Dapper: 2.07 мс
🔸 EF Core: 2.43 мс
(см. скриншот для деталей)
Разница — всего 0.36 мс, или 14%.
Да, Dapper выделяет меньше памяти, но для большинства приложений эта разница мизерная.
Что это значит?
↳ Для 80% проектов такая разница в производительности вообще не критична.
> Поэтому EF Core — мой выбор по умолчанию.
12 причин выбрать EF Core вместо Dapper в реальной разработке:
1. Автоматическое отслеживание изменений сущностей — меньше ручного кода для insert, update, delete.
2. LINQ-запросы с проверкой на этапе компиляции, которые трансформируются в SQL.
3. Code-First миграции упрощают эволюцию схемы базы данных.
4. Возможность реверс-инжиниринга существующей базы в модели.
5. Навигационные свойства позволяют работать с отношениями без ручных join-ов.
6. Поддержка eager, lazy и explicit загрузки данных.
7. Глобальные фильтры запросов для soft delete и мультиарендности.
8. Value Conversions — удобное отображение кастомных типов на столбцы в БД.
9. Встроенные политики повторных попыток (retry) делают соединения с БД более устойчивыми.
10. Interceptors — можно реализовать аудит, логирование, кастомные поведения.
11. Один и тот же запрос работает с множеством провайдеров: SQL Server, PostgreSQL, MySQL, Oracle, SQLite и др.
12. Поддержка миграций сразу для нескольких БД из одного кода.
Важно:
EF Core может не быть самым быстрым в микробенчмарках, но его возможности экономят часы и дни в реальных проектах.
Выбирай инструмент, который делает код чище, а команду — продуктивнее,
а не просто тот, у которого время на пару миллисекунд меньше.
👉 @KodBlog
Ты наверняка слышал, как говорят, что Dapper на 30%, 50% или даже в 2 раза быстрее, чем EF Core?
Это утверждение гуляет повсюду.
Но проведя реальный бенчмарк на .NET 8, с таким запросом:
"Получить топ-5 пользователей, которые оставили больше всего комментариев за последние 7 дней к постам в категории '.NET'"
Результаты удивили:
(см. скриншот для деталей)
Разница — всего 0.36 мс, или 14%.
Да, Dapper выделяет меньше памяти, но для большинства приложений эта разница мизерная.
Что это значит?
↳ Для 80% проектов такая разница в производительности вообще не критична.
> Поэтому EF Core — мой выбор по умолчанию.
12 причин выбрать EF Core вместо Dapper в реальной разработке:
1. Автоматическое отслеживание изменений сущностей — меньше ручного кода для insert, update, delete.
2. LINQ-запросы с проверкой на этапе компиляции, которые трансформируются в SQL.
3. Code-First миграции упрощают эволюцию схемы базы данных.
4. Возможность реверс-инжиниринга существующей базы в модели.
5. Навигационные свойства позволяют работать с отношениями без ручных join-ов.
6. Поддержка eager, lazy и explicit загрузки данных.
7. Глобальные фильтры запросов для soft delete и мультиарендности.
8. Value Conversions — удобное отображение кастомных типов на столбцы в БД.
9. Встроенные политики повторных попыток (retry) делают соединения с БД более устойчивыми.
10. Interceptors — можно реализовать аудит, логирование, кастомные поведения.
11. Один и тот же запрос работает с множеством провайдеров: SQL Server, PostgreSQL, MySQL, Oracle, SQLite и др.
12. Поддержка миграций сразу для нескольких БД из одного кода.
Важно:
EF Core может не быть самым быстрым в микробенчмарках, но его возможности экономят часы и дни в реальных проектах.
Выбирай инструмент, который делает код чище, а команду — продуктивнее,
а не просто тот, у которого время на пару миллисекунд меньше.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥13👍7❤4🍌1
Как реализовать ограничение частоты запросов для аутентифицированных пользователей?
Можно использовать ID пользователя в качестве ключа разбиения (partition key) для лимитирования.
В .NET есть механизм partitioned rate limiter, который позволяет это настроить.
ID пользователя можно получить из claim'а в JWT или из cookie.
Такую политику лимитирования можно применить:
🔸 На уровне API — для простых сценариев
🔸 На уровне reverse proxy — при масштабировании
Хочешь узнать о более продвинутых сценариях лимитирования?
Начни отсюда: тык
👉 @KodBlog
Можно использовать ID пользователя в качестве ключа разбиения (partition key) для лимитирования.
В .NET есть механизм partitioned rate limiter, который позволяет это настроить.
ID пользователя можно получить из claim'а в JWT или из cookie.
Такую политику лимитирования можно применить:
Хочешь узнать о более продвинутых сценариях лимитирования?
Начни отсюда: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🍌2
𝟵𝟬% API не являются настоящими RESTful
Веб-API нельзя считать полностью RESTful без "GPS"
Согласно модели зрелости REST по Ричардсону, существует 4 уровня REST-архитектуры:
> Уровень 0 (Swamp of POX): один endpoint, передача XML или JSON без структуры
> Уровень 1 (Resources): выделенные ресурсы с уникальными URI
> Уровень 2 (HTTP-глаголы): корректное использование методов HTTP (GET, POST, PUT, DELETE, PATCH)
> Уровень 3 (HATEOAS): API динамически предоставляет ссылки, направляя клиента по возможным действиям и состояниям
Большинство API застряли на уровне 2, не реализуя HATEOAS.
Что такое HATEOAS?
Hypermedia as the Engine of Application State — "гипермедиа как движок состояния приложения"
Это как GPS для клиента API:
🔸 API динамически вшивает ссылки, которые подсказывают клиенту, какие действия доступны
🔸 Клиент не хардкодит маршруты, а получает их от сервера
🔸 Это делает API гибким и устойчивым к изменениям — даже при эволюции контракта
Почему это важно?
❌ Без HATEOAS:
> Frontend дублирует бизнес-логику с backend'а (например, решает, показывать ли кнопку "Обновить")
> Это приводит к рассинхрону и багам
✅ С HATEOAS:
> Сервер сам отправляет клиенту ссылку на обновление ресурса
> Frontend просто следует ссылке — никакой лишней логики
Такой подход переносит всю сложность туда, где ей место — на backend.
Ты уже используешь HATEOAS в своих API, или твой проект всё ещё застрял на уровне 2?
👉 @KodBlog
Веб-API нельзя считать полностью RESTful без "GPS"
Согласно модели зрелости REST по Ричардсону, существует 4 уровня REST-архитектуры:
> Уровень 0 (Swamp of POX): один endpoint, передача XML или JSON без структуры
> Уровень 1 (Resources): выделенные ресурсы с уникальными URI
> Уровень 2 (HTTP-глаголы): корректное использование методов HTTP (GET, POST, PUT, DELETE, PATCH)
> Уровень 3 (HATEOAS): API динамически предоставляет ссылки, направляя клиента по возможным действиям и состояниям
Большинство API застряли на уровне 2, не реализуя HATEOAS.
Что такое HATEOAS?
Hypermedia as the Engine of Application State — "гипермедиа как движок состояния приложения"
Это как GPS для клиента API:
Почему это важно?
> Frontend дублирует бизнес-логику с backend'а (например, решает, показывать ли кнопку "Обновить")
> Это приводит к рассинхрону и багам
> Сервер сам отправляет клиенту ссылку на обновление ресурса
> Frontend просто следует ссылке — никакой лишней логики
Такой подход переносит всю сложность туда, где ей место — на backend.
Ты уже используешь HATEOAS в своих API, или твой проект всё ещё застрял на уровне 2?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5❤4🥴2🐳2
Какой синтаксис мокинг-библиотеки для dotnet вам больше по душе из примеров выше?
Moq?
NSubstitute?
FakeItEasy?
и какой библиотекой вы пользуетесь сами и почему?🤵
👉 @KodBlog
Moq?
NSubstitute?
FakeItEasy?
и какой библиотекой вы пользуетесь сами и почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🤨2
Вот 12 популярных инструментов для создания архитектурных диаграмм:
1. C4 Model
↳ Удобная для разработчиков модель визуализации архитектуры на 4 уровнях: Контекст, Контейнер, Компонент, Код.
🔸 icepanel.io или structurizr.com
2. draw.io
↳ Бесплатный open-source веб-инструмент для создания диаграмм. Интегрируется с облачными хранилищами.
🔸 drawio.com
3. PlantUML
↳ Текстовый движок для генерации UML и других диаграмм из кода. Идеален для git‑флоу.
🔸 plantuml.com
4. Mermaid
↳ Markdown-подобный синтаксис для рендеринга блок-схем, последовательностей и т.д.
🔸 mermaid.js.org
5. Excalidraw
↳ Open-source инструмент для совместного рисования в стиле "от руки".
🔸 excalidraw.com
6. mingrammer/diagrams
↳ Библиотека на Python: "диаграммы как код". Позволяет описывать cloud-инфраструктуру кодом.
🔸 GitHub
7. Archimate
↳ Стандартизированный язык моделирования enterprise-архитектуры.
🔸 archimatetool.com
8. Miro
↳ Онлайн-доска для совместной работы: брейншторминг, диаграммы и не только.
🔸 miro.com
9. Lucidchart
↳ Облачный инструмент с умными функциями: AI-диаграммы, схемы архитектуры и т.д.
🔸 lucidchart.com
10. CloudSkew
↳ Онлайн-редактор с иконками AWS/Azure/GCP/K8s. Идеален для визуализации облачной архитектуры.
🔸 cloudskew.com
11. D2
↳ Декларативный язык диаграмм, превращающий текст в структурированные визуализации, подходящие для версионирования.
🔸 d2lang.com
12. Cloudcraft
↳ Заточен под диаграммы архитектуры AWS и Azure.
🔸 cloudcraft.co
Что бы ты ещё добавил?🧠
👉 @KodBlog
1. C4 Model
↳ Удобная для разработчиков модель визуализации архитектуры на 4 уровнях: Контекст, Контейнер, Компонент, Код.
2. draw.io
↳ Бесплатный open-source веб-инструмент для создания диаграмм. Интегрируется с облачными хранилищами.
3. PlantUML
↳ Текстовый движок для генерации UML и других диаграмм из кода. Идеален для git‑флоу.
4. Mermaid
↳ Markdown-подобный синтаксис для рендеринга блок-схем, последовательностей и т.д.
5. Excalidraw
↳ Open-source инструмент для совместного рисования в стиле "от руки".
6. mingrammer/diagrams
↳ Библиотека на Python: "диаграммы как код". Позволяет описывать cloud-инфраструктуру кодом.
7. Archimate
↳ Стандартизированный язык моделирования enterprise-архитектуры.
8. Miro
↳ Онлайн-доска для совместной работы: брейншторминг, диаграммы и не только.
9. Lucidchart
↳ Облачный инструмент с умными функциями: AI-диаграммы, схемы архитектуры и т.д.
10. CloudSkew
↳ Онлайн-редактор с иконками AWS/Azure/GCP/K8s. Идеален для визуализации облачной архитектуры.
11. D2
↳ Декларативный язык диаграмм, превращающий текст в структурированные визуализации, подходящие для версионирования.
12. Cloudcraft
↳ Заточен под диаграммы архитектуры AWS и Azure.
Что бы ты ещё добавил?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Большинство разработчиков неправильно понимают DDD.
Они изучают паттерны (Aggregates, Repositories, Value Objects) и применяют их вслепую.
Но суть DDD — не в паттернах, а в глубоком понимании домена.
Я сам совершал эту ошибку на старте. Помогли не паттерны, а выравнивание с бизнесом.
Главная сложность — коммуникация.
Разные команды называли одно и то же по-разному. Всё изменилось, когда мы построили общий язык.
Истинная ценность DDD:
🔸 Общее понимание
🔸 Чёткая терминология
🔸 Точные модели
После 6+ лет работы вот мой совет:
🔸 Разговаривай с бизнесом
🔸 Учись говорить на их языке
🔸 Моделируй то, что действительно важно
Паттерны тебя не спасут. Поможет только понимание.
И нет, DDD — это не архитектура.
А вот архитектура: клик
А как ты подходишь к DDD?🫥
👉 @KodBlog
Они изучают паттерны (Aggregates, Repositories, Value Objects) и применяют их вслепую.
Но суть DDD — не в паттернах, а в глубоком понимании домена.
Я сам совершал эту ошибку на старте. Помогли не паттерны, а выравнивание с бизнесом.
Главная сложность — коммуникация.
Разные команды называли одно и то же по-разному. Всё изменилось, когда мы построили общий язык.
Истинная ценность DDD:
После 6+ лет работы вот мой совет:
Паттерны тебя не спасут. Поможет только понимание.
И нет, DDD — это не архитектура.
А вот архитектура: клик
А как ты подходишь к DDD?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6😁1
Работать с HTTP-заголовками это сложно?
Короткий ответ: нет. И вот почему
Если ты взаимодействуешь с HTTP-клиентами и запросами, тебе неизбежно придётся работать с заголовками.
Это дополнительные данные, передаваемые вместе с запросом или ответом, которые содержат метаинформацию о сообщении.
Заголовки делятся на 4 группы по контексту:
🔸 Request headers (заголовки запроса)
🔸 Response headers (заголовки ответа)
🔸 Representation headers (информация о формате представления)
🔸 Payload headers (сведения о теле запроса/ответа)
В большинстве случаев ты будешь работать именно с заголовками запроса и ответа.
Добавить заголовки в HTTP-запрос можно двумя способами:
🔸 Добавить ко всем запросам
🔸 Добавить только к конкретному запросу
Если нужно извлечь значение из заголовка , это тоже делается просто.
Оба сценария реализуются достаточно прямолинейно.
HTTP-заголовки повсеместны в современных веб-приложениях, поэтому важно придерживаться лучших практик:
🔸 Использовать лаконичные и понятные заголовки
🔸 Настраивать кэширование через заголовки (
🔸 Учитывать CORS (
🔸 Обеспечивать безопасность уже на уровне заголовков
👉 @KodBlog
Короткий ответ: нет. И вот почему
Если ты взаимодействуешь с HTTP-клиентами и запросами, тебе неизбежно придётся работать с заголовками.
Это дополнительные данные, передаваемые вместе с запросом или ответом, которые содержат метаинформацию о сообщении.
Заголовки делятся на 4 группы по контексту:
В большинстве случаев ты будешь работать именно с заголовками запроса и ответа.
Добавить заголовки в HTTP-запрос можно двумя способами:
Если нужно извлечь значение из заголовка , это тоже делается просто.
Оба сценария реализуются достаточно прямолинейно.
HTTP-заголовки повсеместны в современных веб-приложениях, поэтому важно придерживаться лучших практик:
Cache-Control, ETag
)Access-Control-Allow-Origin
)(Strict-Transport-Security, Content-Security-Policy
и др.)Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤3
Не засоряй код лишним
До сих пор иногда вижу, как разработчики так делают.
Удели пару секунд первому фрагменту кода — он отлично иллюстрирует распространённый зашумлённый антипаттерн.
Видишь проблему? Каждое свойство избыточно повторяет имя класса.
А теперь посмотри на второй фрагмент — определение и использование стали гораздо чище и понятнее, верно?
Запомни: хороший код задаёт контекст один раз, на нужном уровне абстракции.
Когда каждый символ несёт смысл, код становится поддерживаемым и выразительным. Лучший код — это тот, который чётко доносит суть без лишнего дублирования.
👉 @KodBlog
До сих пор иногда вижу, как разработчики так делают.
Удели пару секунд первому фрагменту кода — он отлично иллюстрирует распространённый зашумлённый антипаттерн.
Видишь проблему? Каждое свойство избыточно повторяет имя класса.
А теперь посмотри на второй фрагмент — определение и использование стали гораздо чище и понятнее, верно?
Запомни: хороший код задаёт контекст один раз, на нужном уровне абстракции.
Когда каждый символ несёт смысл, код становится поддерживаемым и выразительным. Лучший код — это тот, который чётко доносит суть без лишнего дублирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍10😍2🤨1
EF Core медленный.
ТАКЖЕ ОНИ -> Используют EF Core, чтобы вернуть:
> 25 полей из таблицы,
> 1 000 000 строк за раз,
> включая данные из всех связанных таблиц.
Лучшая оптимизация производительности — это научиться правильно пользоваться инструментами
👉 @KodBlog
ТАКЖЕ ОНИ -> Используют EF Core, чтобы вернуть:
> 25 полей из таблицы,
> 1 000 000 строк за раз,
> включая данные из всех связанных таблиц.
Лучшая оптимизация производительности — это научиться правильно пользоваться инструментами
Please open Telegram to view this post
VIEW IN TELEGRAM
💯26❤8🔥3👏2
Как создать собственную социальную сеть на .NET
Это отличный проект для самостоятельной реализации.🤓
Базовая реализация платформы может включать следующие сущности:
↳ Пользователи
↳ Посты и категории
↳ Лайки и комментарии
↳ Лента
↳ Уведомления
Рассмотрим реальный кейс:
Пользователь открывает сайт соцсети и видит:
↳ Ленту с актуальными постами
↳ Свои собственные публикации
↳ Уведомления о новых постах, комментариях и лайках к интересующим его записям
Типичное frontend-приложение делает три отдельных запроса к серверу:
Получение ленты
Получение уведомлений
Получение постов пользователя
У этой реализации два ключевых недостатка:
❌ Клиенту приходится делать три отдельных запроса к серверу
❌ Клиенты получают все поля, которые возвращает сервер. Для веба это приемлемо, но для мобильных приложений — избыточно и может замедлять работу
Решение — GraphQL
GraphQL был создан как альтернатива REST, чтобы решить эти проблемы.
Hot Chocolate это самый эффективный и функциональный open-source GraphQL-сервер в экосистеме .NET. Он позволяет легко строить масштабируемые GraphQL API и шлюзы.
Преимущества Hot Chocolate по сравнению с REST API:
✅ Клиент сам выбирает, какие поля ему нужны — никакого
✅ Все данные можно запросить одним запросом, без лишних round-trip’ов
✅ Автогенерация документации, генерация кода и автодополнение в IDE синхронизируют frontend и backend
✅ Встроенные фильтрация, сортировка и пагинация — middleware всё берёт на себя, причём делает это лучше и проще, чем OData
✅ Интерфейс Nitro GraphQL позволяет визуально исследовать типы, собирать запросы и тестировать их за секунды
Автор собрал простую реализацию социальной сети на базе Hot Chocolate GraphQL, и сегодня поделился пошаговой инструкцией с разработчиками, как сделать это правильно с учётом best practices.
Исходный код доступен бесплатно.
👉 @KodBlog
Это отличный проект для самостоятельной реализации.
Базовая реализация платформы может включать следующие сущности:
↳ Пользователи
↳ Посты и категории
↳ Лайки и комментарии
↳ Лента
↳ Уведомления
Рассмотрим реальный кейс:
Пользователь открывает сайт соцсети и видит:
↳ Ленту с актуальными постами
↳ Свои собственные публикации
↳ Уведомления о новых постах, комментариях и лайках к интересующим его записям
Типичное frontend-приложение делает три отдельных запроса к серверу:
Получение ленты
GET /api/feed?userId=1&count=10
Получение уведомлений
GET /api/notifications?userId=1&count=10
Получение постов пользователя
GET /api/users/1/posts?count=10
У этой реализации два ключевых недостатка:
Решение — GraphQL
GraphQL был создан как альтернатива REST, чтобы решить эти проблемы.
Hot Chocolate это самый эффективный и функциональный open-source GraphQL-сервер в экосистеме .NET. Он позволяет легко строить масштабируемые GraphQL API и шлюзы.
Преимущества Hot Chocolate по сравнению с REST API:
overfetch/underfetch
Я использую Hot Chocolate GraphQL в продакшене уже более трёх лет, и это сильно прокачало мои подходы к построению API.
Автор собрал простую реализацию социальной сети на базе Hot Chocolate GraphQL, и сегодня поделился пошаговой инструкцией с разработчиками, как сделать это правильно с учётом best practices.
Исходный код доступен бесплатно.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍7
Как обезопасить свой API?
Вот 5 рекомендаций, которые помогут:
→ Используйте надёжную аутентификацию и авторизацию
→ Валидируйте входные данные и экранируйте выходные
→ Настройте ограничение частоты запросов
→ Шифруйте весь трафик
→ Обеспечьте наблюдаемость
👉 @KodBlog
Вот 5 рекомендаций, которые помогут:
→ Используйте надёжную аутентификацию и авторизацию
→ Валидируйте входные данные и экранируйте выходные
→ Настройте ограничение частоты запросов
→ Шифруйте весь трафик
→ Обеспечьте наблюдаемость
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Жизнь коротка, используй библиотеки .NET
Вот список популярных библиотек, которые стоит рассмотреть:
1. ORM
- EF Core
- Dapper ORM
2. Инструменты для API
- SignalR
- FluentValidation
- MediatR
- YARP
3. Тестирование
- xUnit
- Testcontainers
- FluentAssertions
- Moq
- Verify
4. Логирование и мониторинг
- Serilog
- NLog
- OpenTelemetry
5. Внедрение зависимостей (DI)
- Autofac
- Scrutor
6. Фоновая обработка
- Hangfire
- Quartz .NET
7. Работа с HTTP
- Polly
- RestSharp
- Refit
8. Работа с Office-документами
- ClosedXML
- EPPlus
- Excel-DNA
9. Аутентификация и авторизация
- Microsoft.AspNetCore.Identity
- openiddict
- Keycloak
10. Очереди и брокеры сообщений
- RabbitMQ
- MassTransit
- NServiceBus
P.S. А ты бы какую библиотеку добавил?🥰
👉 @KodBlog
Вот список популярных библиотек, которые стоит рассмотреть:
1. ORM
- EF Core
- Dapper ORM
2. Инструменты для API
- SignalR
- FluentValidation
- MediatR
- YARP
3. Тестирование
- xUnit
- Testcontainers
- FluentAssertions
- Moq
- Verify
4. Логирование и мониторинг
- Serilog
- NLog
- OpenTelemetry
5. Внедрение зависимостей (DI)
- Autofac
- Scrutor
6. Фоновая обработка
- Hangfire
- Quartz .NET
7. Работа с HTTP
- Polly
- RestSharp
- Refit
8. Работа с Office-документами
- ClosedXML
- EPPlus
- Excel-DNA
9. Аутентификация и авторизация
- Microsoft.AspNetCore.Identity
- openiddict
- Keycloak
10. Очереди и брокеры сообщений
- RabbitMQ
- MassTransit
- NServiceBus
P.S. А ты бы какую библиотеку добавил?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6💯3
Изменение стандартного представления класса в режиме отладки
К сведению: мы можем изменить стандартное отображение класса в отладчике C# с помощью атрибута
👉 @KodBlog
К сведению: мы можем изменить стандартное отображение класса в отладчике C# с помощью атрибута
DebuggerDisplay
Please open Telegram to view this post
VIEW IN TELEGRAM
❤32👍4🔥2