⚙️ Создание фоновых задач в .NET с Quartz
Если тебе нужно планировать фоновые задачи в .NET — попробуй Quartz.
Всё просто: реализуешь интерфейс, регистрируешь задачу — и Quartz берёт на себя расписание и выполнение.
✨ Что делает Quartz удобным:
- Глубокая интеграция с Dependency Injection — можно внедрять сервисы, логеры и репозитории;
- Scoped-область задач — безопасно использовать
- Умный планировщик: без ручных таймеров и бесконечных циклов.
После Quartz уже не хочется возвращаться к ручным решениям.
📘 Подробный гайд по продвинутой работе с Quartz в .NET
Если тебе нужно планировать фоновые задачи в .NET — попробуй Quartz.
Всё просто: реализуешь интерфейс, регистрируешь задачу — и Quartz берёт на себя расписание и выполнение.
✨ Что делает Quartz удобным:
- Глубокая интеграция с Dependency Injection — можно внедрять сервисы, логеры и репозитории;
- Scoped-область задач — безопасно использовать
DbContext без проблем с жизненным циклом; - Умный планировщик: без ручных таймеров и бесконечных циклов.
После Quartz уже не хочется возвращаться к ручным решениям.
📘 Подробный гайд по продвинутой работе с Quartz в .NET
Что выведет на экран этот код?
Anonymous Quiz
27%
A42
16%
A6
10%
G
22%
71
22%
Код не скомпилируется
4%
А ты правильно называешь свои DTO? 🤔
DTO (Data Transfer Object) — это объект передачи данных.
Проще говоря, это класс или структура, которая используется, чтобы передавать данные между слоями приложения или между сервером и клиентом (например, в API).
Когда ты создаёшь Web API, твои эндпоинты принимают и отдают данные.
Обычно такие модели называют с суффиксом DTO (Data Transfer Object).
Но вот в чём проблема 👇
❌ DTO часто смешивают входные и выходные данные в одном классе.
❌ Со временем такие классы разрастаются и становятся неразберихой.
👉 Лучше использовать суффиксы Request и Response:
• CreateUserRequest — для входных данных
• UserResponse — для выходных
Почему это лучше:
✅ Понятнее — сразу видно, для чего модель.
✅ Масштабируемо — изменения в Response не ломают Request.
✅ Удобнее сопровождать — не нужно гадать, что делает UserDto.
📌 Совет: какую бы схему ты ни выбрал — будь последовательным и используй её во всём проекте.
А ты используешь Request/Response или по-старинке DTO? 👇
DTO (Data Transfer Object) — это объект передачи данных.
Проще говоря, это класс или структура, которая используется, чтобы передавать данные между слоями приложения или между сервером и клиентом (например, в API).
Когда ты создаёшь Web API, твои эндпоинты принимают и отдают данные.
Обычно такие модели называют с суффиксом DTO (Data Transfer Object).
Но вот в чём проблема 👇
❌ DTO часто смешивают входные и выходные данные в одном классе.
❌ Со временем такие классы разрастаются и становятся неразберихой.
👉 Лучше использовать суффиксы Request и Response:
• CreateUserRequest — для входных данных
• UserResponse — для выходных
Почему это лучше:
✅ Понятнее — сразу видно, для чего модель.
✅ Масштабируемо — изменения в Response не ломают Request.
✅ Удобнее сопровождать — не нужно гадать, что делает UserDto.
📌 Совет: какую бы схему ты ни выбрал — будь последовательным и используй её во всём проекте.
А ты используешь Request/Response или по-старинке DTO? 👇
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ 3 способа определить Middleware в ASP.NET Core
Middleware - это компоненты, которые добавляют дополнительную логику до или после обработки HTTP-запроса.
С их помощью можно реализовать аутентификацию, логирование, кеширование, обработку ошибок и другие сквозные функции приложения.
🔧 В ASP.NET Core уже встроено множество middleware (Static Files, Routing, Authentication и др.),
но вы можете создавать и свои собственные.
Вот три основных способа это сделать:
- Request Delegates - определяете логику прямо в
- Convention-based - создаёте класс с методом
- Factory-based - используете фабрику с внедрением зависимостей (DI)
🧠 Подробный разбор и примеры кода - в статье
#dotnet #aspnetcore #backend #middleware #csharp
Middleware - это компоненты, которые добавляют дополнительную логику до или после обработки HTTP-запроса.
С их помощью можно реализовать аутентификацию, логирование, кеширование, обработку ошибок и другие сквозные функции приложения.
🔧 В ASP.NET Core уже встроено множество middleware (Static Files, Routing, Authentication и др.),
но вы можете создавать и свои собственные.
Вот три основных способа это сделать:
- Request Delegates - определяете логику прямо в
app.Use(...) - Convention-based - создаёте класс с методом
Invoke или InvokeAsync - Factory-based - используете фабрику с внедрением зависимостей (DI)
🧠 Подробный разбор и примеры кода - в статье
#dotnet #aspnetcore #backend #middleware #csharp
Media is too big
VIEW IN TELEGRAM
Шардирование или шардинг - это принцип проектирования базы данных, при котором данные разбиваются на части и размещаются на разных шардах.
Интерактивный лонгрид по шардированию баз данных.
В нем разобрано все - от принципов работы шардов и причин, зачем это вообще нужно, до тонкостей проектирования и типовых ошибок.
Каждый раздел сопровождается интерактивными диаграммами, с которыми можно экспериментировать прямо в статье.
Отличный материал, чтобы прокачать понимание распределённых БД на выходных 💡
Статья: https://planetscale.com/blog/database-sharding
Видео: https://www.youtube.com/watch?v=R2ML2jLs3_U
Please open Telegram to view this post
VIEW IN TELEGRAM
Ubuntu Unity остался без разработчиков и новых релизов
Проект Ubuntu Unity не может сформировать новый релиз 25.10 из-за отсутствия разработчиков, способных исправить критические проблемы с работой пользовательского окружения Unity, возникающие при использовании пакетной базы Ubuntu 25.10. Пользователям Ubuntu Unity не рекомендуется обновлять свои системы до ветки 25.10 или пытаться установить пакеты с Unity поверх других редакций Ubuntu 25.10, так как это может нарушить работоспособность системы.
https://opennet.ru/64125/
Проект Ubuntu Unity не может сформировать новый релиз 25.10 из-за отсутствия разработчиков, способных исправить критические проблемы с работой пользовательского окружения Unity, возникающие при использовании пакетной базы Ubuntu 25.10. Пользователям Ubuntu Unity не рекомендуется обновлять свои системы до ветки 25.10 или пытаться установить пакеты с Unity поверх других редакций Ubuntu 25.10, так как это может нарушить работоспособность системы.
https://opennet.ru/64125/
🔐 Что такое RBAC (Role-Based Access Control)
RBAC - это модель контроля доступа на основе ролей. Она помогает управлять авторизацией в приложениях просто и масштабируемо.
Как работает RBAC:
- Ролям назначаются определённые разрешения (permissions);
- Пользователям присваиваются роли, и через них - разрешения;
- Разрешения определяют, что пользователь может или не может делать.
📌 Преимущество RBAC в том, что можно централизованно управлять правами доступа.
Но часто роли оказываются слишком «грубыми» — не хватает точности для отдельных политик безопасности.
Здесь на помощь приходят permissions — разрешения на конкретные действия.
Если нужно дать доступ другой роли, достаточно просто добавить разрешение к роли, не переписывая всю систему авторизации.
💡 Простая концепция, но невероятно мощная в управлении доступом.
Подробнее
RBAC - это модель контроля доступа на основе ролей. Она помогает управлять авторизацией в приложениях просто и масштабируемо.
Как работает RBAC:
- Ролям назначаются определённые разрешения (permissions);
- Пользователям присваиваются роли, и через них - разрешения;
- Разрешения определяют, что пользователь может или не может делать.
📌 Преимущество RBAC в том, что можно централизованно управлять правами доступа.
Но часто роли оказываются слишком «грубыми» — не хватает точности для отдельных политик безопасности.
Здесь на помощь приходят permissions — разрешения на конкретные действия.
Если нужно дать доступ другой роли, достаточно просто добавить разрешение к роли, не переписывая всю систему авторизации.
💡 Простая концепция, но невероятно мощная в управлении доступом.
Подробнее
Есть три способа заставить команду придерживаться дизайна:
- компилятор и статический анализ
- архитектурные тесты
- код-ревью
Компилятор - лучший друг. Он мгновенно ловит ошибки и не даст собрать проект, если что-то нарушено.
Но как использовать это для защиты архитектуры?
В .NET можно скрывать типы через
internal и разделять код на проекты, чтобы изолировать модули. Проблема - при масштабировании проектов становится слишком много.
Статический анализ полезен, но писать свои Roslyn-правила - удовольствие на любителя.
Поэтому я делаю ставку на архитектурные тесты.
Они позволяют задать правила в виде автотестов и контролировать зависимости между модулями, особенно в модульном монолите: каждый модуль видит только публичный API других модулей.
Ну и код-ревью - финальный фильтр. Кто-то должен глазами подтвердить, что всё ок.
Что выбрать?
Я больше всего полагаюсь на компилятор и архитектурные тесты - это помогает ловить проблемы максимально рано.
Хотите больше? Посмотрите пример использования архитектурных тестов и подход shift left.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вы организуете свои Vertical Slices?
Есть два подхода, и оба встречаются в живых проектах:
1) Один файл → статический класс + вложенные типы
- Request / Response внутри
- Handler внутри
- Validator внутри
- Endpoint там же
- максимум локальности и контекста
- удобно читать как "одна фича – один файл"
2) Каждый тип в отдельном файле
- Request.cs
- Response.cs
- Handler.cs
- Validator.cs
- Endpoint.cs
- привычно для больших команд
- проще искать по имени файла
- лучше работает при очень длинных обработчиках
По сути:
- маленькие обработчики → один файл с вложенными типами
- большие и долгоживущие фичи → отдельные файлы + папка
Главный принцип Vertical Slice — держать фичу целостной.
Не заставлять прыгать по всему solution ради одной команды.
А вы как делаете: всё в одном файле или дробите?```
Есть два подхода, и оба встречаются в живых проектах:
1) Один файл → статический класс + вложенные типы
- Request / Response внутри
- Handler внутри
- Validator внутри
- Endpoint там же
- максимум локальности и контекста
- удобно читать как "одна фича – один файл"
2) Каждый тип в отдельном файле
- Request.cs
- Response.cs
- Handler.cs
- Validator.cs
- Endpoint.cs
- привычно для больших команд
- проще искать по имени файла
- лучше работает при очень длинных обработчиках
По сути:
- маленькие обработчики → один файл с вложенными типами
- большие и долгоживущие фичи → отдельные файлы + папка
Главный принцип Vertical Slice — держать фичу целостной.
Не заставлять прыгать по всему solution ради одной команды.
А вы как делаете: всё в одном файле или дробите?```
⚡️ Что выведет код?
- Объясните, почему вывод именно такой.
- Измените одну строку так, чтобы программа печатала сумму чисел в виде 10+20=30.
1) Ответ
Программа выведет:
10+20
2) Почему так
- В Console.WriteLine("{0}+{1}", a, b); используется композитное форматирование (аналог string.Format).
- Подстановки {0} и {1} заменяются на значения соответствующих аргументов — a и b.
- Знак + находится внутри строкового литерала, значит это просто символ, а не операция сложения.
- Поэтому получается «подставь a, затем символ +, затем b» → 10+20.
Частая ошибка: думать, что + выполнит сложение. Нет — внутри кавычек это обычный текст.
using System;
namespace MyApplication {
class Program {
static void Main(string[] args) {
int a = 10, b = 20;
Console.WriteLine("{0}+{1}", a, b);
}
}
}
- Объясните, почему вывод именно такой.
- Измените одну строку так, чтобы программа печатала сумму чисел в виде 10+20=30.
1) Ответ
Программа выведет:
2) Почему так
- В Console.WriteLine("{0}+{1}", a, b); используется композитное форматирование (аналог string.Format).
- Подстановки {0} и {1} заменяются на значения соответствующих аргументов — a и b.
- Знак + находится внутри строкового литерала, значит это просто символ, а не операция сложения.
- Поэтому получается «подставь a, затем символ +, затем b» → 10+20.
Частая ошибка: думать, что + выполнит сложение. Нет — внутри кавычек это обычный текст.
На Stepik вышел курс - Linux: полный апгрейд твоих скиллов
Хочешь реально понимать, что происходит под капотом твоей системы, а не просто кликать по GUI?
Без глубокого знания базы ты не инженер - ты просто пользователь.
🔹 В курсе ты:
- Освоишь bash, grep, sed, awk - инструменты, которыми живут админы.
- Разберёшь права, процессы, сеть, файловую систему и научишься чинить всё, что падает.
- Настроишь SSH, firewall, systemd, crontab, демоны и автозапуск.
- Научишься анализировать логи, следить за нагрузкой, и не паниковать при 100% CPU.
💡 Формат: пошаговое объяснение базы и разбор важных практик по работе с Linux.
🎯 После курса ты: будешь чувствовать Linux как родную среду и забудешь, что такое “permission denied”.
🚀 Сейчас действуют скидка целых - 30%, не упусти реальный шанс прокачаться.
👉 Пройти курс на Stepik
Хочешь реально понимать, что происходит под капотом твоей системы, а не просто кликать по GUI?
Без глубокого знания базы ты не инженер - ты просто пользователь.
🔹 В курсе ты:
- Освоишь bash, grep, sed, awk - инструменты, которыми живут админы.
- Разберёшь права, процессы, сеть, файловую систему и научишься чинить всё, что падает.
- Настроишь SSH, firewall, systemd, crontab, демоны и автозапуск.
- Научишься анализировать логи, следить за нагрузкой, и не паниковать при 100% CPU.
💡 Формат: пошаговое объяснение базы и разбор важных практик по работе с Linux.
🎯 После курса ты: будешь чувствовать Linux как родную среду и забудешь, что такое “permission denied”.
🚀 Сейчас действуют скидка целых - 30%, не упусти реальный шанс прокачаться.
👉 Пройти курс на Stepik
🔥 EF Core 10 принес нормальные JOIN'ы в LINQ
Больше не нужно вспоминать, как извращаться с GroupJoin + DefaultIfEmpty, чтобы сделать обычный LEFT JOIN.
Теперь есть прямые методы:
✅ LeftJoin
✅ RightJoin
И они делают ровно то, что ты пишешь:
«Оставь все из левой таблицы и подтяни правые записи, если есть совпадения».
Плюсы
- Читаемость выше
- Код короче и очевиднее
- Транслируется в тот же SQL, что и раньше, но без боли
Примерно так LINQ наконец становится ближе к привычному SQL-пониманию разработчика: пишешь join — получаешь join, без магии и обходных путей.
Подробнее про LeftJoin и RightJoin в EF Core 10
#dotnet #efcore #csharp #linq #backend #devtools
Больше не нужно вспоминать, как извращаться с GroupJoin + DefaultIfEmpty, чтобы сделать обычный LEFT JOIN.
Теперь есть прямые методы:
✅ LeftJoin
✅ RightJoin
И они делают ровно то, что ты пишешь:
«Оставь все из левой таблицы и подтяни правые записи, если есть совпадения».
Плюсы
- Читаемость выше
- Код короче и очевиднее
- Транслируется в тот же SQL, что и раньше, но без боли
Примерно так LINQ наконец становится ближе к привычному SQL-пониманию разработчика: пишешь join — получаешь join, без магии и обходных путей.
Подробнее про LeftJoin и RightJoin в EF Core 10
#dotnet #efcore #csharp #linq #backend #devtools