C# 1001 notes
6.56K subscribers
359 photos
9 videos
2 files
328 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
Download Telegram
🖥 Гайд по PostgreSQL для продвинутых разработчиков

PostgreSQL – одна из самых мощных СУБД с открытым исходным кодом. Этот гайд подробно охватывает ключевые аспекты PostgreSQL: от внутренней архитектуры до приёмов оптимизации. Мы рассмотрим администрирование, производительность, расширения, инструменты, а также сравним популярные ORM для Python и Go. В конце приведён список продвинутых вопросов, часто встречающихся на собеседованиях.

🟠Гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🧩 Несколько DbContext в одном приложении на EF Core — когда это нужно

Использовать несколько DbContext в одном приложении — не ошибка, а часто отличное архитектурное решение.
Вот когда это оправдано:

- 🗃 Работа с несколькими базами данных
- 🧠 Разделение областей ответственности
- 🧩 Архитектура modular monolith
- Использование read replicas

Автор применил это при создании модульного монолита:
каждый модуль имел собственную схему в БД и отдельный DbContext в коде.

Самое интересное — как EF Core справляется с миграциями и разными схемами баз данных.
Разбор и пошаговое решение — здесь:
🔗 https://milanjovanovic.tech/blog/using-multiple-ef-core-dbcontext-in-single-application

#DotNet #EFCore #CSharp #Backend #Architecture #DesignPatterns
Что выведет код?

1 — Выбросит исключение
2 — Произойдет взаимоблокировка
3 — Напечатает слово "test"
4 — Напечатает слово "test" бесконечное число раз
Нашёл отличный учебник по основам Computer Science - настоящая находка!

Он охватывает всё самое важное: от классики вроде алгоритма Евклида до продвинутых тем — динамическое программирование, криптография, анализ сложности и не только.

Материал подан чётко, логично и последовательно: каждая концепция — с примерами, интуитивными пояснениями и строгими доказательствами.

Идеально подойдёт тем, кто хочет выйти за рамки синтаксиса и глубоко понять, как устроен код изнутри.

https://eecs376.github.io/notes/algorithms.html
🚀 5 мощных приёмов рефакторинга в C#, которые сделают ваш код чище, проще и надёжнее

Больше не пишите “спагетти” — превращайте запутанный код в красивую архитектуру.

Уберите дублирование
Разбейте методы
Используйте DI и фабрики
Спрячьте логику в объекты
Упростите условия

👉 Пример до/после — на картинке: из хаоса в чистый, тестируемый, поддерживаемый код.

📌 Подробнее
⚡️ Вышел pgbalancer 1.0 - интеллектуальный балансировщик нагрузки для PostgreSQL

Представлен первый стабильный релиз pgbalancer 1.0 — балансировщика нагрузки для PostgreSQL, построенного на основе pgpool-II с существенными доработками.

Проект позиционируется как решение с элементами адаптивной маршрутизации запросов, управляемое через REST API и поддерживающее MQTT для потоковой передачи событий в реальном времени.

Ключевые особенности:
• Управление пулом соединений и распределение нагрузки между репликами PostgreSQL;
•Поддержка HTTP/REST для конфигурации и мониторинга;
• Интеграция с MQTT для стриминга метрик и событий;
• Реализация на языке C с сохранением производительности оригинального pgpool-II;
• Распространяется под открытой лицензией PostgreSQL.

https://www.pgelephant.com/pgbalancer
Что выведет код?

Пишите ответ в комментариях
🖥 Полезный Совет по Visual Studio:

Когда вы создаете метод, который возвращает JSON через raw string literal, добавьте

/* lang=json*/

Этот момент нигде не задокументирован.

Если в JSON будет синтаксическая ошибка вроде пропущенной запятой, Visual Studio подсветит её.
Please open Telegram to view this post
VIEW IN TELEGRAM
Управление зависимостями в ASP.NET Core: меньше рутины, больше автоматизации.

Ручное добавление сервисов через AddScoped и AddSingleton превращает Program.cs в бесконечный список регистраций. Но есть способ проще — библиотека Scrutor.

На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Михаил Дмитриев покажет, как автоматизировать регистрацию сервисов и расширить стандартный IoC контейнер.

📌 18 ноября, 20:00
Управление зависимостями в ASP.NET Core с помощью Scrutor
— массовая регистрация сервисов по правилам
— использование паттерна декоратор
— добавление кэширования без переписывания кода
— реальные примеры для продакшн-проектов

Вебинар бесплатный и будет полезен ASP.NET Core-разработчикам, которые хотят упростить настройку зависимостей и сделать код чище.

👉 Регистрируйтесь: https://otus.pw/HpwY/?erid=2W5zFJ5eURW

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
⚡️ Когда стоит применять паттерн Idempotent Consumer?

В распределённых системах всё непредсказуемо: сообщения могут прийти поздно, в неправильном порядке или продублироваться.
Если надеяться, что каждое сообщение обработается «строго один раз», рано или поздно появятся тихие ошибки в данных.

Производитель может частично решить проблему: многие брокеры (Azure Service Bus, Amazon SQS) сами отбрасывают дубликаты, если у сообщения есть уникальный MessageId.

Но у потребителя ответственность больше.
Паттерн Idempotent Consumer предотвращает повторные побочные эффекты:

1. Перед обработкой проверяем локальную таблицу с ключом (MessageId, ConsumerName).
2. Если записи нет - выполняем логику, коммитим транзакцию и записываем факт обработки.
3. Если запись уже есть - сообщение повторное, просто выходим.

Что делать с внешними сервисами?
Некоторые поддерживают idempotency key (например, email-сервисы), и тогда повторный запрос просто игнорируется.
Если сервис это не умеет, можно сохранять намерение локально и выполнять действие отдельным надёжным процессом.

Важно: не все обработчики нуждаются в этом паттерне.
Если операция сама по себе безопасна при повторе (обновить статус, пересобрать кэш) — дополнительные проверки не нужны.

Используйте Idempotent Consumer там, где повторное выполнение может привести к деньгам, ошибкам или сбоям в бизнес-логике.

milanjovanovic.tech/blog/the-idempotent-consumer-pattern-in-dotnet-and-why-you-need-it
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Быстрый совет для Cursor

Хочешь, чтобы Cursor писал точнее и в твоём стиле?

🧠 Просто создай файл `.cursorrules` в корне проекта и опиши в нём:
- правила кодстайла, которые ты используешь
- предпочтения по структуре, форматированию, именованию

Чем конкретнее, тем лучше работает автогенерация.

🔥 Это помогает избежать «галлюцинаций» и потери контекста при создании кода.
Один навык сделает вас ценным в любой команде — умение находить и устранять узкие места производительности.

Скорость приложения — это не просто «хорошо иметь».
Это деньги, стабильность и доверие пользователей.

И чем больше система, тем больнее становятся проблемы с производительностью.
В микросервисной архитектуре это особенно заметно:
запросы ходят между сервисами, сетевые задержки накапливаются, логика размазана — и понять, где именно тормозит, становится значительно труднее.

Почему так происходит?

- распределённая архитектура усложняет путь запроса
- один медленный сервис замедляет десяток других
- локально всё работает быстро, а в продакшене исчезает производительность
- классические логи дают только фрагменты картины

Но есть хороший инструмент, который решает эту проблему — трейсинг с OpenTelemetry.
Он позволяет пройти вместе с запросом через всю цепочку сервисов и увидеть, где именно начинается задержка.

Это настоящий рентген системы.

Если вы хотите внедрить распределённый трейcинг, автор подготовил пошаговый гайд, который можно адаптировать под любой .NET-проект.

Вот отличная отправная точка:
milanjovanovic.tech/blog/introduction-to-distributed-tracing-with-opentelemetry-in-dotnet