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

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

admin - @haarrp
Download Telegram
📌 Как из HTML сгенерировать PDF в .NET с помощью PuppeteerSharp и Handlebars

Этот пример показывает, как взять HTML-шаблон, подставить данные через Handlebars и преобразовать его в PDF с помощью PuppeteerSharp.

- Читаем HTML-шаблон InvoiceTemplate.html и компилируем его в функцию.

- Подставляем данные, получаем готовый HTML.

- PuppeteerSharp скачивает Chromium.

- Открываем браузер в headless-режиме, создаём страницу, загружаем туда HTML.

- Сохраняем страницу как PDF в формате A4, с фоном и нужными отступами.

Код:

var template = File.ReadAllText("Templates/InvoiceTemplate.html");
var compiled = Handlebars.Compile(template);
string html = compiled(data);

// Скачать Chromium
var fetcher = new BrowserFetcher();
await fetcher.DownloadAsync();

// Рендер в PDF
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
byte[] pdf = await page.PdfDataAsync(new PdfOptions {
Format = PaperFormat.A4,
PrintBackground = true,
MarginOptions = new MarginOptions { Top = "50px", Right = "20px", Bottom = "50px", Left = "20px" }
});


Таким образом можно автоматизировать генерацию счётов, отчётов или любых документов из HTML прямо в C#.
🖥 Большинство .NET разработчиков никогда с этим не сталкиваются.

Но это делает отладку в 10 раз проще.

Стандартный вид при отладке:

{Namespace.ObjectName}


Никакого контекста. Много путаницы.

Но всего одной строкой кода?

Теперь окно наблюдения показывает:


Order ORD-2025-002: Bob Evans - 89.50
Order ORD-2025-003: Maria Lee - 1200.00


В чём фишка?

Используйте DebuggerDisplay.

Добавляете этот атрибут в начало класса, чтобы контролировать, как будет отображаться информация о классе при отладке.

В следующий раз, когда будете смотреть на {Namespace.ObjectName}, помните: так не обязательно должно быть.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔐 RBAC (Role-Based Access Control) в действии

Как работает RBAC:
- Роли получают набор разрешений
- Пользователи получают роли → а значит и разрешения
- Разрешения определяют, что пользователь может или не может делать

📌 Поток авторизации:
1. Пользователь проходит аутентификацию
2. Получает access token (JWT)
3. Делает API-запрос с токеном
4. Токен преобразуется в claims
5. Проверка прав (authorize)
6. Ответ API

Пример обработчика RBAC в C#:

internal sealed class PermissionAuthorizationHandler
: AuthorizationHandler<PermissionRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
PermissionRequirement requirement)
{
HashSet<string> permissions = context.User.GetPermissions();

if (permissions.Contains(requirement.Permission))
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}

}
В EF Core чаще всего используют два подхода:
- Database-First — быстрое создание моделей из готовой БД
- Code-First — проектирование схемы через C# классы и миграции

Но оба могут тормозить разработку при сложных связях и настройках.

👉 Есть третий путь — Model-First.
Вы визуально проектируете модель, а она автоматически превращается в EF Core сущности и схему БД.

🛠 Один из лучших инструментов — Entity Developer от Devart:
- drag-and-drop интерфейс вместо ручного кода
- меньше рутины и ошибок в конфигурации
- точная генерация кода и SQL-скриптов
- быстрее дизайн → генерация → обновление моделей

Меньше кода ✍️, больше скорости 🚀.

#dotnet #efcore #csharp #devtools
🔥 Хотите разобраться в ASP.NET Core на практике?

Репозиторий — это более 400+ римеров для всех версий ASP.NET Core (от 2.1 до 10 Preview).

Что внутри:
- Minimal API, Blazor, SignalR, gRPC
- Аутентификация, кэширование, health-checks
- Middleware, Razor Pages, HTMX и многое другое

Каждый пример запускается командой dotnet watch run и демонстрирует отдельную фичу.

Репо собрало уже 10k+ звёзд и считается одним из лучших ресурсов для изучения ASP.NET Core.

📌 Github
Forwarded from C# (C Sharp) programming
🔍 NetSonar — инструмент для сетевой диагностики от sn4k3

NetSonar — это лёгкая и кроссплатформенная утилита, которая помогает диагностировать сеть, визуализировать данные и управлять сетевыми интерфейсами.

🧰 Возможности:
Многопротокольные пинги: ICMP, TCP, UDP и HTTP — проверка доступности и измерение задержек
Управление интерфейсами: просмотр IP‑конфигураций, статистики и управление адаптерами в реальном времени
Сканирование сети: обнаружение устройств, подсетей и открытых портов
Современный UI: интерфейс на Avalonia + SukiUI с тёмной темой и графиками
Кроссплатформенность: работает на Windows, macOS и Linux (на базе .NET)
Открытый код: лицензия AGPL‑3.0 — можно адаптировать и дорабатывать

🛠 Установка:
🔹 Windows:


🖥 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Amplication — это инструмент с открытым исходным кодом для автоматического генерации серверной части .NET и Node.js приложений!

🌟 Он позволяет разработчикам быстро создавать API и соответствующую серверную логику, исключая необходимость вручную писать код для повторяющихся задач, таких как создание CRUD-операций, управление базой данных и аутентификация. Amplication ориентирован на ускорение разработки и избавление от рутины, предоставляя мощные возможности для конфигурирования и расширения с помощью плагинов и кастомных решений.

🔐 Лицензия: Apache-2.0

🖥 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
⚖️ Monolith или microservices — не вопрос "что лучше".

Важно другое: каждая архитектура даёт свои плюсы и минусы.

Когда нужны микросервисы:
- независимые деплои
- разные технологии под сервисы
- гибкое масштабирование по частям

Все остальные выгоды можно получить и в монолите. Поэтому мой выбор чаще всего — modular monolith: проще, дешевле, без лишней сложности.

📖 Подробнее: https://milanjovanovic.tech/modular-monolith-architecture?utm_source=X&utm_medium=social&utm_campaign=01.09.2025

#Architecture #Monolith #Microservices #SoftwareEngineering
🚫 EF Core + «репозитории» = лишний слой

Часто советуют заворачивать EF Core в Repository Pattern.
Но на практике это делает код только сложнее:

- DbContext уже реализует Repository и Unit of Work
- Репозитории со временем превращаются в «монстров» с десятками методов
- Каждый новый фильтр = новая копипаста

В итоге — абстракция над абстракцией и трудности с поддержкой.

---

Что вместо этого? Specification Pattern

Specification = маленький класс, описывающий правило или фильтр.
Вы комбинируете их и получаете сложные запросы без раздутых репозиториев.

Плюсы:
- 🧩 Простая композиция правил
- 🔍 Ясный и читаемый код
- ♻️ Повторное использование условий
- 🧪 Лёгкое тестирование

📌 Пример


// Бизнес-правило: активные клиенты с заказами за последние 30 дней
public sealed class ActiveCustomersSpec : Specification<Customer>
{
public ActiveCustomersSpec(DateTime since)
{
Criteria = c => c.IsActive && c.Orders.Any(o => o.CreatedAt >= since);
AddInclude(c => c.Orders);
}
}

// Применение
var spec = new ActiveCustomersSpec(DateTime.UtcNow.AddDays(-30));
var customers = await db.Set<Customer>().Apply(spec).ToListAsync();


💡 Итог:

EF Core = уже Repository + UoW

Репозитории поверх EF Core → лишняя абстракция

Specification Pattern → гибкость и читаемость без «метод-монстров»