#Собес #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
#полезное
🛞 Entity Framework 10 будет поддерживать именованные фильтры запросов
Да, это означает, что несколько фильтров теперь можно применять одновременно, начиная с EF 10+ — при условии, что они именованные.
👉 Новости 👉 База вопросов
Да, это означает, что несколько фильтров теперь можно применять одновременно, начиная с EF 10+ — при условии, что они именованные.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🥄 PolySharp — удобный способ использовать новые фичи C# на старых версиях .NET. Этот NuGet-пакет работает как source-генератор, автоматически подбирая нужные полифиллы в зависимости от целевой платформы. Для работы достаточно добавить ссылку на PolySharp, установить последнюю версию C# и можно писать современный код даже для .NET Framework или UWP.
Инструмент обладает умной генерацией только необходимых типов. Например, если компилятору C# 13 нужен
Гитхаб
👉 Новости 👉 База вопросов
Инструмент обладает умной генерацией только необходимых типов. Например, если компилятору C# 13 нужен
[IsExternalInit] для init-only свойств, PolySharp создаст его за кулисами. При этом он не трогает фичи, требующие поддержки рантайма, но покрывает огромный пласт синтаксических улучшений — от nullable-аннотаций до интерполированных строковых обработчиков. Гитхаб
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #postgres
🤔 Что такое секционирование таблиц (table partitioning) в PostgreSQL?
Секционирование - это разделение таблицы на несколько меньших частей (секции), которые обрабатываются отдельно. Это повышает производительность запросов и облегчает управление большими обьемами данных.
👉 Новости 👉 Платформа
Секционирование - это разделение таблицы на несколько меньших частей (секции), которые обрабатываются отдельно. Это повышает производительность запросов и облегчает управление большими обьемами данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤓 Использование Dapper
Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.
Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.
👉 Новости 👉 База вопросов
Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.
Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #postgres
🤔 Что такое транзакции в PostgreSQL?
Транзакция - это последовательность операций, которые выполняются как единое целое. Если одна операция не удалась, все изменения откатываются, чтобы сохранить данные в консистентном состоянии. Транзакции поддерживают свойства ACID: атомарность, согласованность, изоляцию и долговечность.
👉 Новости 👉 Платформа
Транзакция - это последовательность операций, которые выполняются как единое целое. Если одна операция не удалась, все изменения откатываются, чтобы сохранить данные в консистентном состоянии. Транзакции поддерживают свойства ACID: атомарность, согласованность, изоляцию и долговечность.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😱 Простой способ улучшить методы в C#
(с переменным числом параметров)
Используй улучшения ключевого слова
Ключевое слово
Раньше:
Теперь в C# 13 и .NET 9:
-
-
-
Это упрощает код и делает API гибче.
👉 Новости 👉 База вопросов
(с переменным числом параметров)
Используй улучшения ключевого слова
params из .NET 9.Ключевое слово
params в C# позволяет передавать переменное количество аргументов без необходимости перегрузки методов. Это удобно, когда количество входных параметров заранее неизвестно.Раньше:
params работал только с массивами.Теперь в C# 13 и .NET 9:
params можно использовать с любыми коллекциями, у которых есть метод Add, включая:-
Span<T>-
ReadOnlySpan<T>-
IEnumerable<T>Это упрощает код и делает API гибче.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#полезное
😇 Как правильно структурировать фичу в формате вертикального среза?
Вот простая структура вертикального среза, которую можно смело брать на вооружение:
🟠 Объект запроса/ответа
🟠 Определение эндпоинта
🟠 Бизнес-логика
Всё, что относится к одной фиче, находится в одном месте.
Почему это круто — объяснено здесь
Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.
👉 Новости 👉 База вопросов
Вот простая структура вертикального среза, которую можно смело брать на вооружение:
Всё, что относится к одной фиче, находится в одном месте.
Почему это круто — объяснено здесь
Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😵💫 Вот настройка OpenTelemetry для трассировки и логирования в .NET:
Если хочешь узнать больше, то вот гайд как экспортировать телеметрию в Grafana
👉 Новости 👉 База вопросов
Если хочешь узнать больше, то вот гайд как экспортировать телеметрию в Grafana
Please open Telegram to view this post
VIEW IN TELEGRAM