План модуля 10.libraries — Популярні бібліотеки ASP.NET
План модуля 10.libraries — Популярні бібліотеки ASP.NET
!NOTE Цей план містить перелік «мастхев» бібліотек для сучасної ASP.NET розробки. Кожна тема — це окрема стаття, що пояснює проблему, рішення та практичне впровадження.
01. Валідація: FluentValidation
Проблема: DataAnnotations розкидані по полях, складно тестувати, неможливо додати складну логіку (наприклад, перевірку унікальності в БД). Зміст:
- Створення валідатора
AbstractValidator<T> - Ланцюжки правил:
.NotEmpty().EmailAddress() - Кастомна логіка через
.Must() - Вкладена валідація та валідація колекцій
- Автоматична інтеграція з ASP.NET Pipeline
02. Маппінг: Mapster
Проблема: Ручний маппінг (переписування полів з DTO в Entity) займає багато часу та призводить до помилок. AutoMapper занадто складний та повільний. Зміст:
- Чому Mapster? (Performance & Simplicity)
- Базовий маппінг через
.Adapt<T>() - Конфігурація правил маппінгу
- Code Generation: створення мапперів під час білду
- Маппінг складних вкладених структур
03. Обробка помилок: ErrorOr / Result Pattern
Проблема: Використання Exceptions для бізнес-помилок — це дорого і робить код важким для читання. Зміст:
- Концепція Result Pattern
- Бібліотека
ErrorOr: типи успіху та помилок - Match/Switch логіка в ендпоінтах
- Інтеграція з Minimal API (Problem Details)
04. Логування: Serilog
Проблема: Стандартне логування — це просто текст. Складно фільтрувати по ID користувача або Transaction ID. Зміст:
- Structured Logging (JSON логування)
- Enrichers: автоматичне додавання контексту (MachineName, ThreadId)
- Sinks: куди відправляти логи (File, Seq, Elasticsearch)
- Налаштування через
appsettings.json
05. Команди та Запити: MediatR
Проблема: Величезні контролери/сервіси з десятками залежностей. Зміст:
- Патерн Mediator та CQRS (Command Query Responsibility Segregation)
- Розділення логіки на Request та Handler
- Pipeline Behaviors: логування та валідація «крізь» усі запити
- Notifications: Event-driven підхід всередині додатку
06. Відмовостійкість: Polly
Проблема: Зовнішні API падають. Потрібно вміти «перечекати» або «спробувати ще раз». Зміст:
- Resilience patterns: Retry (повтор) та Circuit Breaker (запобіжник)
- Timeout та Fallback (запасний план)
- Інтеграція з
HttpClient - Резильєнтність у .NET 8+ через Resilience Pipelines
07. Моніторинг здоров’я: Health Checks
Проблема: Як дізнатися, що база даних впала або Redis недоступний без перевірки логів? Зміст:
- Створення
/healthендпоінта - Перевірка зовнішніх залежностей (DB, Redis, External API)
- UI для Health Checks: візуальний моніторинг стану системи
08. Керування фічами: Feature Management
Проблема: Як вимкнути функцію в продакшені без редиплою? Зміст:
- Feature Flags (Toggle)
- Умовне відображення UI та логіки
- Поступовий rollout (випуск фічі на 10% користувачів)
- Feature filters (ввімкнення фічі тільки для адмінів)
09. Робота з Email: FluentEmail
Проблема: SmtpClient застарів, а API сервісів (SendGrid, Mailgun) різні.
Зміст:
- Fluent-інтерфейс для створення листів
- Razor-шаблони для HTML-листів
- Інтеграція з різними провайдерами (SMTP, SendGrid)
10. Генерація PDF: QuestPDF
Проблема: Створення PDF через HTML-to-PDF — це боляче, повільно і нестабільно. Зміст:
- Layout-based підхід (як у Flutter або CSS Grid)
- Компоненти: Таблиці, Зображення, Текст
- Висока продуктивність та стабільність верстки
11. Тестові дані: Bogus
Проблема: Складно створювати реалістичні дані для тестів вручну. Зміст:
- Генерація імен, адрес, телефонів, описів товарів
- Створення складних графів об'єктів для Seed-data
- Локалізація даних (українські імена)
12. Корисні дрібниці: Humanizer & Guard Clauses
Проблема: Код завалений перевірками if (obj == null) throw... та некрасивим відображенням дат/чисел.
Зміст:
- Humanizer: перетворення "2023-01-01" у "2 місяці тому" або "100" у "сто"
- Guard Clauses: чистий код через
Guard.Against.Null(obj)
Майбутній модуль 11. Observability (OpenTelemetry)
Окремий великий модуль (Планується):
- Distributed Tracing: відстеження запиту крізь кілька мікросервісів
- Metrics: збір кастомних бізнес-метрик (кількість замовлень, швидкість запитів)
- Jaeger & Prometheus: візуалізація трас та графіків
- Instrumentation: як автоматично збирати дані з EF Core, Redis, HttpClient
Humanizer та Guard Clauses в ASP.NET Core
Humanizer: перетворення даних у людиночитабельний текст (дати, числа, рядки, переліки). Guard Clauses: захисні перевірки для чистого коду без вкладених if-else.
Від Minimal API до Razor Pages: концептуальний перехід
Плавний перехід від Minimal API до Razor Pages: навіщо потрібен server-side rendering, коли обирати API vs SSR, порівняльна таблиця концепцій, Convention-based routing через файлову структуру Pages/, перші кроки у Program.cs.