C# Portal | Программирование
15K subscribers
755 photos
86 videos
19 files
666 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
Хочешь отслеживать изменения в базе данных в реальном времени?

Я реализовал Change Data Capture (CDC) в .NET с использованием Debezium, PostgreSQL и RabbitMQ.

Поток обработки:

> PostgreSQL настроен на генерацию событий об изменениях
> Debezium перехватывает эти изменения
> События публикуются в RabbitMQ
> MassTransit в .NET потребляет и обрабатывает их

Это лишь один из способов реализации архитектуры, основанной на событиях (Event-Driven Architecture).

Если ты проектируешь распределённые системы в .NET — вот полный гайд по созданию event-driven-систем с RabbitMQ

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥3
Видишь баг?

9 из 10 разработчиков пропускают его. Проверь себя

Проблема:

> ExecuteUpdateAsync и ExecuteDeleteAsync обходят Change Tracker в EF Core
> Если SaveChangesAsync() потом упадёт — обновления в базе не откатятся автоматически

Решение:


Явно оборачивай все такие команды в транзакцию вручную

Мелочь, а последствия могут быть серьёзные 😨

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123🎉1
5 недооценённых LINQ-методов, которые мгновенно улучшают твой код:

1. Zip — объединяет две последовательности в пары

2. Chunk — разбивает коллекцию на чанки фиксированного размера

3. OfType<T>() — фильтрует элементы по типу

4. DistinctBy — возвращает уникальные элементы по заданному ключу

5. SelectMany — разворачивает вложенные коллекции в плоский список

Бонус, который почти попал в топ:

> SequenceEqual — сравнивает две коллекции на равенство
> Aggregate — накапливает значение с помощью функции (reduce)
> GroupJoin — объединяет по группам (аналог LEFT OUTER JOIN)
> ToLookup — создает коллекцию, похожую на Dictionary, но с множеством значений
> Intersect — возвращает пересечение двух коллекций

LINQ — кладезь полезных методов, если знаешь, где копать 💪

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1412🔥10
Вы правильно внедряете зависимости в контроллеры?

Многие разработчики об этом не знают 👇

В контроллер можно внедрить зависимости двумя способами:
↳ через конструктор
↳ через метод (endpoint)

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

А вызываемый endpoint использует только часть из них.

Это приводит к перерасходу памяти, так как все зависимости из конструктора выделяются в куче при каждом вызове контроллера — даже если они не используются.

Так зачем не внедрять нужные объекты прямо в метод endpoint’а?

Для этого больше не требуется аннотация [FromServices] — как и в Minimal API.

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

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🤔3😁1
Визуализатор планов SQL-запросов для Entity Framework

Расширение EFCore.Visualizer для Visual Studio может стать настоящим прорывом.

Оно позволяет разработчикам просматривать план выполнения SQL-запросов напрямую внутри Visual Studio.

А ты уже пробовал? ☺️

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍43
Секреты оптимизации SQL-запросов

Вот 20 проверенных техник, которые я регулярно использую для оптимизации SQL-запросов: 😊

• Грамотно используйте индексы:
Индексируйте критически важные столбцы, используемые в WHERE, JOIN, ORDER BY и GROUP BY.

• Избегайте SELECT *:
Выбирайте только необходимые столбцы, чтобы сократить объём передаваемых данных и время обработки.

• Реализуйте пагинацию корректно:
Используйте OFFSET и FETCH NEXT или пагинацию методом поиска (seek method) для эффективного постраничного вывода.

• Ограничивайте количество строк как можно раньше:
Применяйте фильтрацию на ранних этапах, чтобы максимально сократить размер выборки.

• Избегайте функций в WHERE:
Функции над столбцами блокируют использование индексов — переписывайте условия, используя «сырые» столбцы.

• Упрощайте JOIN:
Минимизируйте количество соединений и избегайте избыточных JOIN-ов.

• Выбирайте правильные типы JOIN:
Используйте INNER JOIN, LEFT JOIN или EXISTS там, где это уместно, чтобы избежать лишней обработки данных.

• Используйте корректные типы данных:
Сопоставляйте типы данных в JOIN и WHERE, чтобы обеспечить эффективное использование индексов.

• Запрашивайте только изменённые данные:
Реализуйте инкрементальную обработку, а не полный повторный запрос таблиц.

• Группируйте операции:
Пакетная вставка, обновление или удаление снижают накладные расходы на транзакции.

• Исключайте избыточные подзапросы:
Используйте JOIN или CTE вместо повторяющихся подзапросов.

• Используйте EXISTS вместо IN:
EXISTS часто работает быстрее, чем IN, особенно на больших объёмах данных.

• Нормализуйте с умом:
Балансируйте между нормализацией и денормализацией в производительно критичных запросах.

• Применяйте материализованные представления:
Предварительно рассчитывайте сложные агрегации и запросы для ускорения чтения.

• Анализируйте планы выполнения:
Регулярно проверяйте execution plan, чтобы находить и устранять ресурсоёмкие операции.

• Избегайте подстановок с начальным %:
LIKE '%abc' не использует индексы эффективно.

• Делайте транзакции короткими:
Сокращайте время выполнения транзакций, чтобы уменьшить блокировки и конфликты.

• Регулярно обновляйте статистику:
Актуальные статистики обеспечивают точное планирование запросов СУБД.

• Используйте подсказки (query hints) с осторожностью:
Применяйте только после тестирования и при необходимости конкретной оптимизации.

• Постоянно отслеживайте и настраивайте:
Регулярно анализируйте производительность запросов и проактивно оптимизируйте медленные запросы.


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84
Нужно генерировать PDF-отчёты в C#?

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

> Определите шаблон с помощью Razor View
> Преобразуйте Razor в HTML
> Сконвертируйте HTML в PDF (например, с помощью IronPdf, DinkToPdf или wkhtmltopdf)

Вы получаете полный контроль над стилями, и это легко интегрируется в существующие .NET-приложения.

Рабочую версию можно собрать менее чем за час.

▶️Полный пример здесь: here

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍2🔥2
Создание и управление PDF-документами — это распространённая и критически важная задача для многих приложений, разработанных на .NET. Часто требуется генерировать счета, отчёты, договоры или преобразовывать содержимое из веб-страниц и других форматов.

Чтобы обеспечивать профессиональное качество документов без задержек, необходима надёжная PDF-библиотека.

В этом материале мы рассмотрим следующие темы:

🔸Создание PDF-документов с нуля.
🔸Конвертация между PDF и другими популярными форматами.
🔸Практические сценарии генерации PDF-документов в ASP.NET Core.
🔸Сравнение популярных PDF-библиотек по критериям: производительность, удобство использования, опыт разработчика, документация, поддержка и лицензирование.

Мы рассмотрим следующие библиотеки для .NET:

> QuestPDF
> IronPDF
> Aspose.PDF

В результате вы сможете определить, какая библиотека наилучшим образом соответствует требованиям вашего проекта, что позволит сэкономить время и обеспечить профессиональную обработку PDF в вашем приложении ❤️

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3
Два шаблона, которые должен учитывать каждый распределённый система:

> Оркестрация — централизованное управление; один сервис координирует поток выполнения.
> Хореография — децентрализованное управление; сервисы реагируют на события самостоятельно.

Компромиссы:

> Оркестрация даёт больше контроля, но приводит к более жёсткой связности (tight coupling).
> Хореография лучше масштабируется, но усложняет координацию.

Выбор между ними зависит от требуемого уровня контроля, связности и автономности сервисов.

Здесь — более подробное сравнение обоих подходов. 🙂

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😐2
В .NET 10 появится {Async}Enumerable.{Infinite}Sequence

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

▶️https://github.com/dotnet/runtime/pull/116538

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112
Устали прыгать между дашбордами, пытаясь понять, почему ваша .NET-приложение ведёт себя странно?

Новый плагин OpenTelemetry для JetBrainsRider приносит все данные наблюдаемости прямо в IDE.

Больше никакого переключения контекста: просто запускайте приложение и следите за логами, метриками и трейсами рядом с кодом

Доступно уже сейчас в Rider 2025.2 EAP5 😮

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10
В современных сложных программных средах понимание того, что происходит внутри приложения — уже не опция, а необходимость.

Баги любят прятаться в тени и появляются в самый неожиданный момент.

OpenTelemetry проливает свет на происходящее внутри приложения.
Он предоставляет стандартизированный способ сбора и анализа телеметрических данных, обеспечивая прозрачность поведения системы.

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

У каждого приложения есть внешние зависимости: базы данных, кэши, API, внешние сервисы. Мониторинг этих зависимостей критичен для понимания производительности и взаимодействия приложения с остальной системой.

Сегодня нашёл для вас руководство о том, как внедрить OpenTelemetry для получения ценных данных о производительности и состоянии системы. 😊

Вы узнаете:

> Что такое OpenTelemetry и зачем он нужен
> Что такое логи, метрики и трейсы
> Как подключить OpenTelemetry к своему проекту
> Как просматривать данные OpenTelemetry в Jaeger
> Как просматривать данные OpenTelemetry в Seq
> Как добавлять кастомную инструментализацию и свойства в OpenTelemetry

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍3
Каждый проект, над которым я работал, использовал методы-расширения.

До недавнего времени в C# был только один способ их создавать.

С выходом C# 14 появились extension members.

Эта возможность позволяет добавлять методы и поля к уже существующим типам без необходимости:

> создавать производные типы
> перекомпилировать исходный код
> модифицировать оригинальный тип

Как это реализовать в коде:

> Определите контейнер расширений — участки кода внутри static-классов, которые добавляют новые члены к существующим типам
> Размещайте код расширений внутри этих контейнеров

Важно понимать: extension members не нарушают принцип инкапсуляции — они подчиняются тем же правилам доступа, что и исходный тип.

Если вы планируете использовать их, учтите:

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

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥96😐3
Если ты хочешь писать надёжные веб-приложения, важно хорошо понимать, как работают REST API.

И в этом курсе ты разберёшься со всеми основами.

Он охватывает ключевые принципы REST-архитектуры, фреймворк ASP.NET Core, HTTP-методы, интеграцию с базой данных и многое другое. 😎

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥2
5 NuGet-пакетов для EF Core, о которых ты, скорее всего, не знал

Вот 5 пакетов, которые могут мгновенно прокачать твой проект на EF Core:

1️⃣EntityFramework.Exceptions
↳ Упрощает обработку ошибок, выбрасывая исключения, специфичные для конкретной БД
https://github.com/Giorgi/EntityFramework.Exceptions

2️⃣EFCore.NamingConventions
↳ Автоматически приводит имена сущностей и полей к snake_case, kebab-case и другим стилям
https://github.com/efcore/EFCore.NamingConventions

3️⃣Audit.EntityFramework.Core
↳ Прозрачно отслеживает изменения сущностей для аудита
https://github.com/thepirat000/Audit.NET

4️⃣Microsoft.EntityFrameworkCore.DynamicLinq
↳ Позволяет выполнять LINQ-запросы, передавая их как строки во время выполнения
https://dynamic-linq.net

5️⃣Z.EntityFramework.Extensions.EFCore
↳ Упрощает bulk-операции: массовые вставки, обновления и удаления работают в разы быстрее
https://entityframework-extensions.net/

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍52🐳1