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

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

admin - @haarrp
Download Telegram
🌟 Знаете ли вы, что с помощью информационных атрибутов можно получить информацию о вызывающем методе?

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что мне нравится в **.NET Aspire** 👇

👉 С ним невероятно просто запускать полезные сервисы. Всего в несколько строк кода можно поднять:
- базу данных
- Redis
- LLM
- reverse proxy
- message broker

Можно даже масштабировать сервисы, чтобы проверить сценарии с конкурентной нагрузкой.

Если вы ещё не пробовали построить своё первое Aspire-приложение — у меня есть подробный гайд о том, как я мигрировал свой .NET проект в Aspire.

🟠Читать здесь: https://milanjovanovic.tech/blog/dotnet-aspire-a-game-changer-for-cloud-native-development
Please open Telegram to view this post
VIEW IN TELEGRAM
.NET Channel Publisher — простой способ строить настоящий async messaging

📌 Как это работает:
- Использует System.Threading.Channels для асинхронной публикации событий
- Сообщения пишутся в канал и обрабатываются в фоне, не блокируя поток
- Поддержка CancellationToken для безопасной отмены

🔥 Плюсы:
- Минимум кода — максимум гибкости
- Высокая производительность и низкая задержка
- Удобно для event-driven архитектуры и микросервисов

На скриншоте:
- Пример класса ChannelPublisher для отправки нотификаций
- Трейсинг вызова Order.Service: POST orders показывает прозрачную обработку и асинхронность

#dotnet #csharp #async #messaging
С EF Core можно делать действительно классные вещи — вот пример конфигурации сущности:

- 🔒 Check constraint: Price > 0 — защита данных прямо на уровне БД.
- 🎯 Precision control — задаём точность для столбца Price, чтобы избежать ошибок округления.
- 🧩 Unique index на Name — просто потому что можно (и полезно).

Пример конфигурации:

builder.Property(p => p.Price)
.HasPrecision(10, 2);

builder.HasCheckConstraint("CK_Product_Price_Positive", "Price > 0");

builder.HasIndex(p => p.Name)
.IsUnique();


Следующий шаг — создать EF migration, чтобы применить эти настройки в базе данных.
Если вы хотите разобраться глубже — вот отличный гайд по миграциям в EF Core: гайд
🖥 Гайд по 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
⚡️ Когда стоит применять паттерн 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
ASP .NET 10 получил новую возможность — Server-Sent Events (SSE)

В свежем ASP .NET 10 появилась поддержка Server-Sent Events — современного способа стримить данные в браузер без WebSockets.

Что такое SSE
- Односторонний канал: сервер → браузер
- Идеально подходит для потоковых обновлений, логов, нотификаций, live-данных
- Работает поверх обычного HTTP, без сложной настройки протокола

Почему это круто
- Проще, чем WebSockets
- Легче масштабировать
- Отлично подходит для real-time интерфейсов и hypermedia-приложений
- Встроено прямо в ASP .NET 10, без сторонних библиотек

Это может стать большим шагом для разработки динамичных и интерактивных UI — особенно там, где нужен непрерывный поток данных, но WebSockets избыточны.

#dotnet #aspnet #csharp #backend #webdev
Реактивное программирование в C# Advanced: сложные операторы, обработка ошибок и холодные/горячие Observable

Асинхронность в C# может быть простой, если знать, как с ней работать правильно. На открытом вебинаре курса OTUS C# Developer. Advanced Елена Сычева покажет, как реактивное программирование помогает избавиться от Callback Hell и писать код, который сам реагирует на данные и события.

📌 26 ноября, 20:00
Реактивное программирование в C# Advanced
— продвинутые операторы Rx.NET: Switch, GroupBy, Buffer, Throttle
— устойчивые к сбоям системы: Catch, Retry, Finally
— холодные и горячие Observable: Publish, Replay, RefCount
— управление подписками и жизненным циклом реактивных компонентов

Вебинар будет полезен разработчикам на C#, работающим с асинхронным кодом, потоками данных и событиями. Участники узнают, как проектировать реактивные системы, способные восстанавливаться после ошибок, и писать декларативный, читаемый и эффективный код.

👉 Зарегистрируйтесь: https://otus.pw/kdEI/?erid=2W5zFJeYfSx

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
This media is not supported in your browser
VIEW IN TELEGRAM
Так вот как становятся ПМ…