Нужно генерировать PDF-отчёты в C#?
Вот простой и гибкий подход, который я использую, например, для счетов:
> Определите шаблон с помощью Razor View
> Преобразуйте Razor в HTML
> Сконвертируйте HTML в PDF (например, с помощью IronPdf, DinkToPdf или wkhtmltopdf)
Вы получаете полный контроль над стилями, и это легко интегрируется в существующие .NET-приложения.
Рабочую версию можно собрать менее чем за час.
▶️ Полный пример здесь: here
👉 @KodBlog
Вот простой и гибкий подход, который я использую, например, для счетов:
> Определите шаблон с помощью Razor View
> Преобразуйте Razor в HTML
> Сконвертируйте HTML в PDF (например, с помощью IronPdf, DinkToPdf или wkhtmltopdf)
Вы получаете полный контроль над стилями, и это легко интегрируется в существующие .NET-приложения.
Рабочую версию можно собрать менее чем за час.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍2🔥2
Создание и управление PDF-документами — это распространённая и критически важная задача для многих приложений, разработанных на .NET. Часто требуется генерировать счета, отчёты, договоры или преобразовывать содержимое из веб-страниц и других форматов.
Чтобы обеспечивать профессиональное качество документов без задержек, необходима надёжная PDF-библиотека.
В этом материале мы рассмотрим следующие темы:
🔸 Создание PDF-документов с нуля.
🔸 Конвертация между PDF и другими популярными форматами.
🔸 Практические сценарии генерации PDF-документов в
🔸 Сравнение популярных PDF-библиотек по критериям: производительность, удобство использования, опыт разработчика, документация, поддержка и лицензирование.
Мы рассмотрим следующие библиотеки для .NET:
> QuestPDF
> IronPDF
> Aspose.PDF
В результате вы сможете определить, какая библиотека наилучшим образом соответствует требованиям вашего проекта, что позволит сэкономить время и обеспечить профессиональную обработку PDF в вашем приложении❤️
👉 @KodBlog
Чтобы обеспечивать профессиональное качество документов без задержек, необходима надёжная PDF-библиотека.
В этом материале мы рассмотрим следующие темы:
ASP.NET Core
.Мы рассмотрим следующие библиотеки для .NET:
> QuestPDF
> IronPDF
> Aspose.PDF
В результате вы сможете определить, какая библиотека наилучшим образом соответствует требованиям вашего проекта, что позволит сэкономить время и обеспечить профессиональную обработку PDF в вашем приложении
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3
Два шаблона, которые должен учитывать каждый распределённый система:
> Оркестрация — централизованное управление; один сервис координирует поток выполнения.
> Хореография — децентрализованное управление; сервисы реагируют на события самостоятельно.
Компромиссы:
> Оркестрация даёт больше контроля, но приводит к более жёсткой связности (tight coupling).
> Хореография лучше масштабируется, но усложняет координацию.
Выбор между ними зависит от требуемого уровня контроля, связности и автономности сервисов.
Здесь — более подробное сравнение обоих подходов.🙂
👉 @KodBlog
> Оркестрация — централизованное управление; один сервис координирует поток выполнения.
> Хореография — децентрализованное управление; сервисы реагируют на события самостоятельно.
Компромиссы:
> Оркестрация даёт больше контроля, но приводит к более жёсткой связности (tight coupling).
> Хореография лучше масштабируется, но усложняет координацию.
Выбор между ними зависит от требуемого уровня контроля, связности и автономности сервисов.
Здесь — более подробное сравнение обоих подходов.
Please open Telegram to view this post
VIEW IN TELEGRAM
😐2
В .NET 10 появится
Теперь разработчики смогут удобно генерировать бесконечные последовательности как в синхронном, так и в асинхронном виде.
▶️ https://github.com/dotnet/runtime/pull/116538
👉 @KodBlog
{Async}Enumerable.{Infinite}Sequence
Теперь разработчики смогут удобно генерировать бесконечные последовательности как в синхронном, так и в асинхронном виде.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2
Устали прыгать между дашбордами, пытаясь понять, почему ваша .NET-приложение ведёт себя странно?
Новый плагин OpenTelemetry для JetBrainsRider приносит все данные наблюдаемости прямо в IDE.
Больше никакого переключения контекста: просто запускайте приложение и следите за логами, метриками и трейсами рядом с кодом
Доступно уже сейчас в Rider 2025.2 EAP5😮
👉 @KodBlog
Новый плагин OpenTelemetry для JetBrainsRider приносит все данные наблюдаемости прямо в IDE.
Больше никакого переключения контекста: просто запускайте приложение и следите за логами, метриками и трейсами рядом с кодом
Доступно уже сейчас в Rider 2025.2 EAP5
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
В современных сложных программных средах понимание того, что происходит внутри приложения — уже не опция, а необходимость.
Баги любят прятаться в тени и появляются в самый неожиданный момент.
OpenTelemetry проливает свет на происходящее внутри приложения.
Он предоставляет стандартизированный способ сбора и анализа телеметрических данных, обеспечивая прозрачность поведения системы.
OpenTelemetry необходим для мониторинга любого приложения — от распределённых микросервисов до монолитов. Да, даже в монолитной архитектуре вы получите выгоду от использования OpenTelemetry.
У каждого приложения есть внешние зависимости: базы данных, кэши, API, внешние сервисы. Мониторинг этих зависимостей критичен для понимания производительности и взаимодействия приложения с остальной системой.
Сегодня нашёл для вас руководство о том, как внедрить OpenTelemetry для получения ценных данных о производительности и состоянии системы.😊
Вы узнаете:
> Что такое OpenTelemetry и зачем он нужен
> Что такое логи, метрики и трейсы
> Как подключить OpenTelemetry к своему проекту
> Как просматривать данные OpenTelemetry в Jaeger
> Как просматривать данные OpenTelemetry в Seq
> Как добавлять кастомную инструментализацию и свойства в OpenTelemetry
👉 @KodBlog
Баги любят прятаться в тени и появляются в самый неожиданный момент.
OpenTelemetry проливает свет на происходящее внутри приложения.
Он предоставляет стандартизированный способ сбора и анализа телеметрических данных, обеспечивая прозрачность поведения системы.
OpenTelemetry необходим для мониторинга любого приложения — от распределённых микросервисов до монолитов. Да, даже в монолитной архитектуре вы получите выгоду от использования OpenTelemetry.
У каждого приложения есть внешние зависимости: базы данных, кэши, API, внешние сервисы. Мониторинг этих зависимостей критичен для понимания производительности и взаимодействия приложения с остальной системой.
Сегодня нашёл для вас руководство о том, как внедрить OpenTelemetry для получения ценных данных о производительности и состоянии системы.
Вы узнаете:
> Что такое OpenTelemetry и зачем он нужен
> Что такое логи, метрики и трейсы
> Как подключить OpenTelemetry к своему проекту
> Как просматривать данные OpenTelemetry в Jaeger
> Как просматривать данные OpenTelemetry в Seq
> Как добавлять кастомную инструментализацию и свойства в OpenTelemetry
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍3
Каждый проект, над которым я работал, использовал методы-расширения.
До недавнего времени в C# был только один способ их создавать.
С выходом C# 14 появились extension members.
Эта возможность позволяет добавлять методы и поля к уже существующим типам без необходимости:
> создавать производные типы
> перекомпилировать исходный код
> модифицировать оригинальный тип
Как это реализовать в коде:
> Определите контейнер расширений — участки кода внутри static-классов, которые добавляют новые члены к существующим типам
> Размещайте код расширений внутри этих контейнеров
Важно понимать: extension members не нарушают принцип инкапсуляции — они подчиняются тем же правилам доступа, что и исходный тип.
Если вы планируете использовать их, учтите:
🔸 Метод-расширение не будет вызван, если у типа уже есть метод с такой же сигнатурой
🔸 Методы-расширения подключаются на уровне пространства имён (namespace)
👉 @KodBlog
До недавнего времени в C# был только один способ их создавать.
С выходом C# 14 появились extension members.
Эта возможность позволяет добавлять методы и поля к уже существующим типам без необходимости:
> создавать производные типы
> перекомпилировать исходный код
> модифицировать оригинальный тип
Как это реализовать в коде:
> Определите контейнер расширений — участки кода внутри static-классов, которые добавляют новые члены к существующим типам
> Размещайте код расширений внутри этих контейнеров
Важно понимать: extension members не нарушают принцип инкапсуляции — они подчиняются тем же правилам доступа, что и исходный тип.
Если вы планируете использовать их, учтите:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤6😐3
5 NuGet-пакетов для EF Core, о которых ты, скорее всего, не знал
Вот 5 пакетов, которые могут мгновенно прокачать твой проект на EF Core:
1️⃣ EntityFramework.Exceptions
↳ Упрощает обработку ошибок, выбрасывая исключения, специфичные для конкретной БД
— https://github.com/Giorgi/EntityFramework.Exceptions
2️⃣ EFCore.NamingConventions
↳ Автоматически приводит имена сущностей и полей к
— 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
Вот 5 пакетов, которые могут мгновенно прокачать твой проект на EF Core:
↳ Упрощает обработку ошибок, выбрасывая исключения, специфичные для конкретной БД
— https://github.com/Giorgi/EntityFramework.Exceptions
↳ Автоматически приводит имена сущностей и полей к
snake_case, kebab-case
и другим стилям— https://github.com/efcore/EFCore.NamingConventions
↳ Прозрачно отслеживает изменения сущностей для аудита
— https://github.com/thepirat000/Audit.NET
↳ Позволяет выполнять LINQ-запросы, передавая их как строки во время выполнения
— https://dynamic-linq.net
↳ Упрощает bulk-операции: массовые вставки, обновления и удаления работают в разы быстрее
— https://entityframework-extensions.net/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍5❤2🐳1
В .NET 10, который выйдет в ноябре этого года, значительно оптимизируют работу с небольшими массивами
Если JIT-компилятор определяет, что массив достаточно мал и не выходит за пределы области видимости метода, он размещает его в стеке, а не в куче. Это означает, что память не аллоцируется в heap, GC не задействуется, а производительность повышается почти в два раза.😊
Например, в .NET 9 массив из 11 элементов занимал 72 байта и выполнялся за 7.7 наносекунды. В .NET 10 те же данные, но 0 байт аллокации и всего 3.9 наносекунды. И самое главное это работает автоматически
👉 @KodBlog
Если JIT-компилятор определяет, что массив достаточно мал и не выходит за пределы области видимости метода, он размещает его в стеке, а не в куче. Это означает, что память не аллоцируется в heap, GC не задействуется, а производительность повышается почти в два раза.
Например, в .NET 9 массив из 11 элементов занимал 72 байта и выполнялся за 7.7 наносекунды. В .NET 10 те же данные, но 0 байт аллокации и всего 3.9 наносекунды. И самое главное это работает автоматически
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥12❤2
Стриминговые API в C# — используй
> Производители используют
> Потребители читают данные через
Зачем нужны стриминговые API?
В отличие от bulk-передачи, стриминг отправляет данные пакетами.
Сколько и когда передавать — зависит от кода, создающего
Параметр
Где особенно полезно:
1. Отправка больших (или даже бесконечных) наборов данных
Пример: поливать сад из шланга вместо таскания вёдер с водой.
Вёдра тяжелее (ресурсоёмко) и требуют ожидания (блокировка).
2. Получение внешних данных — API, IoT-сенсоры, очереди сообщений
Когда нельзя предсказать, когда будет готов следующий элемент —
3. Снижение потребления памяти
Данные проходят потоком и не накапливаются в памяти целиком.
👉 @KodBlog
IAsyncEnumerable
IAsyncEnumerable
оптимизирован для потоковой передачи данных и полностью совместим с async/await.> Производители используют
IAsyncEnumerable<T>
с yield return
> Потребители читают данные через
await foreach
Зачем нужны стриминговые API?
В отличие от bulk-передачи, стриминг отправляет данные пакетами.
Сколько и когда передавать — зависит от кода, создающего
IAsyncEnumerable
.Параметр
T
задаёт тип элемента, который будет возвращаться в потоке.Где особенно полезно:
1. Отправка больших (или даже бесконечных) наборов данных
Пример: поливать сад из шланга вместо таскания вёдер с водой.
Вёдра тяжелее (ресурсоёмко) и требуют ожидания (блокировка).
2. Получение внешних данных — API, IoT-сенсоры, очереди сообщений
Когда нельзя предсказать, когда будет готов следующий элемент —
IAsyncEnumerable
идеально подходит.3. Снижение потребления памяти
Данные проходят потоком и не накапливаются в памяти целиком.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤1
«Сначала фильтруй, потом объединяй» звучит умно. Но это не всегда быстрее.
В SQL порядок написания клауз не определяет порядок выполнения, этим занимается планировщик запросов.
Так что, хотя кажется, что ранняя фильтрация должна уменьшить объём данных перед JOIN — на практике это часто не так.
Планировщик может:
> Самостоятельно оптимизировать стратегии объединения
> Перестраивать порядок операций
> Использовать индексы
Реальный прирост производительности даёт понимание планов выполнения, а не следование «правилам на глазок».
Вот подробный разбор этого популярного мифа про SQL и того, что на самом деле влияет на производительность
👉 @KodBlog
В SQL порядок написания клауз не определяет порядок выполнения, этим занимается планировщик запросов.
Так что, хотя кажется, что ранняя фильтрация должна уменьшить объём данных перед JOIN — на практике это часто не так.
Планировщик может:
> Самостоятельно оптимизировать стратегии объединения
> Перестраивать порядок операций
> Использовать индексы
Реальный прирост производительности даёт понимание планов выполнения, а не следование «правилам на глазок».
Вот подробный разбор этого популярного мифа про SQL и того, что на самом деле влияет на производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥3