#полезное
😎 C# наконец-то получает дискриминируемые объединения
Ну, возможно?
Появилось новое предложение по добавлению объединений типов (Type Unions) в C#. И это действительно важно.
Почему?
Это открывает нативную поддержку таких конструкций, как
Больше не нужно городить костыли, оборачивать значения или зависеть от сторонних библиотек, чтобы описать функцию, возвращающую успех или ошибку.
Теперь это может измениться.
В предложении описываются нативные union-типы, включая поддержку pattern matching, проверку исчерпывающего перебора (exhaustiveness checks) и другие фичи.
Не хочешь ждать?
Вот как можно реализовать паттерн
Если предпочитаешь бросать исключения — можешь это пропустить.
👉 Новости 👉 База вопросов
Ну, возможно?
Появилось новое предложение по добавлению объединений типов (Type Unions) в C#. И это действительно важно.
Почему?
Это открывает нативную поддержку таких конструкций, как
Result и Option.Больше не нужно городить костыли, оборачивать значения или зависеть от сторонних библиотек, чтобы описать функцию, возвращающую успех или ошибку.
Я уже много лет выступаю за использование паттерна Result. Но до сих пор отсутствие поддержки на уровне языка делало его применение неуклюжим.
Теперь это может измениться.
В предложении описываются нативные union-типы, включая поддержку pattern matching, проверку исчерпывающего перебора (exhaustiveness checks) и другие фичи.
Не хочешь ждать?
Вот как можно реализовать паттерн
Result уже сегодняЕсли предпочитаешь бросать исключения — можешь это пропустить.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#полезное
😊 Работать с HTTP-заголовками это сложно?
Короткий ответ: нет. И вот почему
Если ты взаимодействуешь с HTTP-клиентами и запросами, тебе неизбежно придётся работать с заголовками.
Это дополнительные данные, передаваемые вместе с запросом или ответом, которые содержат метаинформацию о сообщении.
Заголовки делятся на 4 группы по контексту:
🟠 Request headers (заголовки запроса)
🟠 Response headers (заголовки ответа)
🟠 Representation headers (информация о формате представления)
🟠 Payload headers (сведения о теле запроса/ответа)
В большинстве случаев ты будешь работать именно с заголовками запроса и ответа.
Добавить заголовки в HTTP-запрос можно двумя способами:
🟠 Добавить ко всем запросам
🟠 Добавить только к конкретному запросу
Если нужно извлечь значение из заголовка , это тоже делается просто.
Оба сценария реализуются достаточно прямолинейно.
HTTP-заголовки повсеместны в современных веб-приложениях, поэтому важно придерживаться лучших практик:
🟠 Использовать лаконичные и понятные заголовки
🟠 Настраивать кэширование через заголовки (
🟠 Учитывать CORS (
🟠 Обеспечивать безопасность уже на уровне заголовков
👉 Новости 👉 База вопросов
Короткий ответ: нет. И вот почему
Если ты взаимодействуешь с 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
#Собес #CSharp
🤔 Чем отличаются lEnumerable и IQueryable? Где применяется отложенное выполнение запросов?
👉 Новости 👉 База вопросов
IEnumerable<T> выполняет перебор элементов в памяти (in-memory) и поддерживает отложенное выполнение только LINQ-to-Objects. IQueryable‹T› расширяет IEnumerable‹T> и позволяет строить выражения, которые переводятся в запрос на удалённый источник (БД), выполняя отложенное (deferred) выполнение на стороне сервера при первом переборе.Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
❤️🔥 EF Core медленный.
ТАКЖЕ ОНИ -> Используют EF Core, чтобы вернуть:
> 25 полей из таблицы,
> 1 000 000 строк за раз,
> включая данные из всех связанных таблиц.
Лучшая оптимизация производительности — это научиться правильно пользоваться инструментами
👉 Новости 👉 База вопросов
ТАКЖЕ ОНИ -> Используют EF Core, чтобы вернуть:
> 25 полей из таблицы,
> 1 000 000 строк за раз,
> включая данные из всех связанных таблиц.
Лучшая оптимизация производительности — это научиться правильно пользоваться инструментами
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👨💻 Изменение стандартного представления класса в режиме отладки
К сведению: мы можем изменить стандартное отображение класса в отладчике C# с помощью атрибута
👉 Новости 👉 База вопросов
К сведению: мы можем изменить стандартное отображение класса в отладчике C# с помощью атрибута
DebuggerDisplayPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#Собес #CSharp
🤔 Что такое record в С#? Какие преимущества они дают?
👉 Новости 👉 База вопросов
record - это тип-спецификация С # для создания неизменяемых (immutable) ссылочных объектов с автоматически сгенерированными методами Equals, GetHashCode И Tostring . Они поддерживают «неугасающие» (with ) копии с изменением части свойств. Это упрощает работу с DTO и моделями, где важно сравнение по значению и безопасное клонирование.Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 Зачем нужны health checks и мониторинг?
Если в приложении что-то ломается - ты должен узнать об этом сразу.
Health checks сокращают цикл обратной связи:
ты получаешь уведомление в ту же секунду, как только что-то пошло не так.
Health checks в
🔵 Реализуешь
🔵 Кастомные проверки пишутся просто
🔵 Есть готовые проверки из коробки
🔵 Гибко настраиваемый формат ответа
🔵 Можно интегрировать с любым инструментом мониторинга или алертинга
Вот как начать использовать Health Checks: тут
👉 Новости 👉 База вопросов
Если в приложении что-то ломается - ты должен узнать об этом сразу.
Health checks сокращают цикл обратной связи:
ты получаешь уведомление в ту же секунду, как только что-то пошло не так.
Health checks в
ASP.NET Core:IHealthCheckВот как начать использовать Health Checks: тут
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤯 Как EF Core стал ближе к Dapper?
Всё благодаря одной фиче:
Сырые SQL-запросы к неотражённым типам (unmapped types).
Теперь ваши запросы могут возвращать любые типы, которые можно сопоставить, не добавляя их в EF-модель.
Рекомендуемый способ использования это метод
Ключевые особенности этой фичи:
> Поддержка представлений , хранимых процедур и функций
> Комбинирование SQL и LINQ в одном запросе
> Защита от SQL-инъекций
👉 Новости 👉 База вопросов
Всё благодаря одной фиче:
Сырые SQL-запросы к неотражённым типам (unmapped types).
Теперь ваши запросы могут возвращать любые типы, которые можно сопоставить, не добавляя их в EF-модель.
Рекомендуемый способ использования это метод
SqlQuery<T> для параметризованных запросов.Ключевые особенности этой фичи:
> Поддержка представлений , хранимых процедур и функций
> Комбинирование SQL и LINQ в одном запросе
> Защита от SQL-инъекций
В одном из проектов мы внедрили 3 таких запроса в прод, и сразу заметили, что код стал чище и легче в поддержке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
😱 Забирай мой подход к упрощению управления потоками:
(в .NET 9)
Вместо использования классического
Вместе с ним добавлен метод
Этот тип даёт более удобную и безопасную синхронизацию потоков за счёт нового API.
Оператор
В этом случае он использует новый API, а не старый Monitor.
Пример кода выше.
👉 Новости 👉 База вопросов
(в .NET 9)
Вместо использования классического
System.Threading.Monitor, в .NET 9 появился новый тип — System.Threading.Lock.Вместе с ним добавлен метод
Lock.EnterScope(), который создаёт эксклюзивную область и автоматически освобождает блокировку в конце блока кода.Этот тип даёт более удобную и безопасную синхронизацию потоков за счёт нового API.
Оператор
lock в C# теперь сам распознаёт, если ты передаёшь объект типа Lock.В этом случае он использует новый API, а не старый Monitor.
Пример кода выше.
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 Как вы делили микросервисы по доменным областям?
Сервисы группируют по аккуратным bounded context: пользователи, заказы, инвентарь, биллинг. Каждая область отвечает за свой контекст данных и бизнес-логику, хранит собственную БД. Это упрощает понимание, тестирование и развитие отдельных частей системы. При необходимости добавляют сервисы-агрегаторы для оркестрации.
👉 Новости 👉 База вопросов
Сервисы группируют по аккуратным bounded context: пользователи, заказы, инвентарь, биллинг. Каждая область отвечает за свой контекст данных и бизнес-логику, хранит собственную БД. Это упрощает понимание, тестирование и развитие отдельных частей системы. При необходимости добавляют сервисы-агрегаторы для оркестрации.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😘 Как сделать ужасный API-дизайн:
- Возвращай
А как лучше?
Используй Problem Details для обработки ошибок в API.
Хотя бы договоритесь в команде о едином формате ответов при ошибках.
Я видел API, которые возвращают
Problem Details — это стандарт для описания ошибок в HTTP-ответах.
Обычных HTTP-статусов недостаточно, чтобы передать полезную информацию об ошибке.
Реализовать Problem Details в .NET — на самом деле просто.
Вот гайд: читать
👉 Новости 👉 База вопросов
- Возвращай
200 OK с телом {"success": false}А как лучше?
Используй Problem Details для обработки ошибок в API.
Хотя бы договоритесь в команде о едином формате ответов при ошибках.
Я видел API, которые возвращают
200 OK даже при ошибке в теле (да, это в сторону GraphQL-разработчиков).Problem Details — это стандарт для описания ошибок в HTTP-ответах.
Обычных HTTP-статусов недостаточно, чтобы передать полезную информацию об ошибке.
Реализовать Problem Details в .NET — на самом деле просто.
Вот гайд: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
Properties в ASP.NET Core — недооценённый, но важный механизм
Если вы используете куки или OpenID Connect в ASP.NET Core, то наверняка сталкивались с объектом
AuthenticationProperties. Он не просто "дополнительные параметры" — это мощный инструмент управления поведением аутентификации.Что можно сделать с AuthenticationProperties:
• Установить срок действия куки:
new AuthenticationProperties { ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1) }
• Указать URL возврата после логина:
new AuthenticationProperties { RedirectUri = "/dashboard" }
• Добавить временные метки, элементы состояния, флаги:
Например, IsPersistent, IssuedUtc, AllowRefresh, и кастомные значения.
• Используется в:
HttpContext.SignInAsync(...)
ChallengeAsync(...) для OIDC
редиректах после логина/логаута
Это ключевой объект, если вы хотите более гибко управлять логикой входа, выхода и жизненным циклом сессии в ASP.NET Core.
Полный разбор:
https://blog.duendesoftware.com/posts/20250527-the-role-of-authenticationproperties-in-aspnet-core
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 В чём преимущества микросервисной архитектуры перед МОНОЛИТОМ?
Микросервисы позволяют развивать, развёртывать и масштабировать каждую бизнес-функцию независимо, снижая время выхода фичи. Они повышают устойчивость: сбой одного сервиса не останавливает всю систему. Также каждая команда может выбирать оптимальный стек технологий. Но требуют сложной инфраструктуры для оркестрации и мониторинга.
👉 Новости 👉 База вопросов
Микросервисы позволяют развивать, развёртывать и масштабировать каждую бизнес-функцию независимо, снижая время выхода фичи. Они повышают устойчивость: сбой одного сервиса не останавливает всю систему. Также каждая команда может выбирать оптимальный стек технологий. Но требуют сложной инфраструктуры для оркестрации и мониторинга.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👋 Как защитить приложение от уязвимостей:
(всего в 4 строках кода)
Используйте
С минимальными усилиями вы можете защитить Web API, добавив аутентификацию и авторизацию.
После быстрой настройки (всего в несколько строк кода) вы автоматически получаете готовые эндпоинты для:
✅ двухфакторной аутентификации
✅ входа в систему
✅ регистрации
✅ сброса пароля
✅ подтверждения email
Безопасность это не то, что стоит реализовывать с нуля самостоятельно.
Выше пример, как это настроить
👉 Новости 👉 База вопросов
(всего в 4 строках кода)
Используйте
ASP.NET Core 8 IdentityASP.NET Core 8 Identity вводит новые API, упрощающие реализацию входа и управление учетными записями.С минимальными усилиями вы можете защитить Web API, добавив аутентификацию и авторизацию.
После быстрой настройки (всего в несколько строк кода) вы автоматически получаете готовые эндпоинты для:
Безопасность это не то, что стоит реализовывать с нуля самостоятельно.
Выше пример, как это настроить
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😐 Dapper быстрый, но отображение отношений "один ко многим" может вызвать проблемы.
В чём проблема?
SQL-join возвращает дублированные данные с "одной" стороны, а Dapper отдаёт по одной строке за раз.
Как решить?
Используйте
Это просто, как только вы освоите шаблон.
Вот чистый пример: ссылка на статью
👉 Новости 👉 База вопросов
В чём проблема?
SQL-join возвращает дублированные данные с "одной" стороны, а Dapper отдаёт по одной строке за раз.
Как решить?
Используйте
Dictionary<TKey, TEntity>, чтобы отслеживать и повторно использовать родительские объекты при добавлении дочерних элементов.Это просто, как только вы освоите шаблон.
Вот чистый пример: ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😬 Как перестать усложнять проверки типов:
(и назначать переменные с ненулевыми значениями)
Используйте шаблон объявления (declaration pattern).
Шаблон объявления позволяет проверить, совместим ли тип выражения во время выполнения с указанным типом.
Также можно объявить локальную переменную как результат этой проверки.
Пример использования шаблона объявления в коде выше.
👉 Новости 👉 База вопросов
(и назначать переменные с ненулевыми значениями)
Используйте шаблон объявления (declaration pattern).
Шаблон объявления позволяет проверить, совместим ли тип выражения во время выполнения с указанным типом.
Также можно объявить локальную переменную как результат этой проверки.
Пример использования шаблона объявления в коде выше.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#Собес #CSharp
🤔 Как решали проблему высокой нагрузки на БД при генерации отчетов?
Отчёты перенесли в отдельное аналитическое хранилище (Data Warehouse) с регулярным ETL из OLTP- базы. Для срочных отчётов использовали materialized view c incremental refresh либо pre-aggregated таблицы, обновляемые по расписанию. Часто применяли асинхронную генерацию через background job (Hangfire, Quartz) и кэширование результатов в Redis.
👉 Новости 👉 База вопросов
Отчёты перенесли в отдельное аналитическое хранилище (Data Warehouse) с регулярным ETL из OLTP- базы. Для срочных отчётов использовали materialized view c incremental refresh либо pre-aggregated таблицы, обновляемые по расписанию. Часто применяли асинхронную генерацию через background job (Hangfire, Quartz) и кэширование результатов в Redis.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Хватит загружать строки в память только ради их удаления.
В EF Core теперь есть поддержка массового удаления через
🟠 Пиши LINQ-запрос для фильтрации записей
🟠 Чейни несколько
🟠 Вызывай
Без трекинга, без материализации. Только SQL.
Как это использовать (и на что стоит обратить внимание) — читать
👉 Новости 👉 База вопросов
В EF Core теперь есть поддержка массового удаления через
ExecuteDelete().Where-условий ExecuteDelete(), чтобы выполнить один SQL DELETEБез трекинга, без материализации. Только SQL.
Как это использовать (и на что стоит обратить внимание) — читать
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #postgres
🤔 Что такое View (представление) в PostgreSQL?
View — это виртуальная таблица, основанная на SQL-запросе. Она не хранит данные, а предоставляет упрощенный способ доступа к результатам сложных запросов. Views помогают улучшить читаемость кода, повышают безопасность и обеспечивают удобство повторного использования.
👉 Новости 👉 Платформа
View — это виртуальная таблица, основанная на SQL-запросе. Она не хранит данные, а предоставляет упрощенный способ доступа к результатам сложных запросов. Views помогают улучшить читаемость кода, повышают безопасность и обеспечивают удобство повторного использования.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Я работаю с перечислениями каждый день.
И вот 4 лучших практики, которыми я пользуюсь, чтобы код в проекте оставался чистым:
🟠 Явно указывать тип хранения
🟠 Использовать атрибуты
🟠 Хелпер-метод для получения значения из атрибута
🟠 Безопасный парсинг через
👉 Новости 👉 База вопросов
И вот 4 лучших практики, которыми я пользуюсь, чтобы код в проекте оставался чистым:
Description для отображаемых имёнDescriptionTryParsePlease open Telegram to view this post
VIEW IN TELEGRAM
👍2