Цей репозиторій є прикладом реалізації різних підходів до побудови бекенду на .NET 9. Рішення складається з трьох незалежних проєктів, кожен з яких демонструє специфічні патерни доступу до даних (SQL vs NoSQL), архітектурні стилі (Clean Architecture, CQRS) та бібліотеки.
Рішення розділене на три основні сервіси:
Класичний REST API для управління каталогом товарів.
- База даних: SQLite (
catalog.db). - ORM: Entity Framework Core.
- Архітектура: N-Layer architecture.
- Ключові патерни:
- Repository & Generic Repository: Абстракція доступу до даних.
- Specification Pattern: Динамічна побудова запитів (фільтрація, сортування, пагінація) без засмічення контролерів.
- Global Exception Middleware: Централізована обробка помилок.
Сервіс відгуків та рейтингів, оптимізований для великої кількості операцій читання/запису.
- База даних: MongoDB.
- Підхід: CQRS (Command Query Responsibility Segregation).
- Бібліотеки: MediatR (для реалізації команд і запитів), MongoDB Driver.
- Ключові особливості:
- Vertical Slices: Кожна фіча (наприклад,
CreateReview,GetProductStats) має свою власну папку з хендлером, командою та валідатором. - Aggregation Pipeline: Використання агрегацій MongoDB для розрахунку середнього рейтингу.
- Nested Documents: Збереження коментарів всередині документу відгуку.
Сервіс замовлень, де критична швидкість та контроль над транзакціями.
- База даних: PostgreSQL.
- ORM: Dapper (Micro-ORM) + ADO.NET.
- Ключові патерни:
- Unit of Work: Управління транзакціями (Commit/Rollback) на рівні бізнес-операції.
- Manual Mapping: Повний контроль над SQL запитами для максимальної продуктивності.
- Framework: .NET 9.0
- Data Access: Entity Framework Core, Dapper, MongoDB.Driver
- Validation: FluentValidation
- Mapping: AutoMapper
- Documentation: Swagger / OpenAPI
- Databases: SQLite, PostgreSQL, MongoDB
- .NET 9 SDK
- Docker (для запуску PostgreSQL та MongoDB)
Переконайтеся, що у вас запущені контейнери для Postgres та Mongo (або локальні сервери).
- PostgreSQL: Connection string очікує порт
5432, userarsenkhomiak, databaseorders_db. - MongoDB: Connection string очікує
mongodb://localhost:27017.
CatalogApp (SQLite - база створиться автоматично):
cd CatalogApp
dotnet run
# Swagger: http://localhost:5129/swagger
CatalogApp.Mongo:
cd CatalogApp.Mongo
dotnet run
# Swagger: http://localhost:5129/swagger (порт може відрізнятися, перевірте launchSettings.json)
CatalogApp.AdoDapper:
cd CatalogApp.AdoDapper
dotnet run
# Слухає порт 5200 за замовчуванням
# Swagger: http://localhost:5200/swagger
Дозволяє чисто описувати бізнес-логіку вибірки даних:
// Пошук товарів за критеріями, включення категорій та пагінація
var spec = new ProductWithCategorySpecification(productParams);
var products = await _productsRepo.ListAsync(spec);Ізольована логіка обробки однієї команди (створення відгуку):
public async Task<Review> Handle(CreateReviewCommand request, CancellationToken ct)
{
var newReview = new Review { ... };
await _reviews.InsertOneAsync(newReview, cancellationToken: ct);
return newReview;
}Управління транзакцією при створенні замовлення:
try {
_unitOfWork.BeginTransaction();
var orderId = _unitOfWork.Orders.Create(order);
_unitOfWork.Commit(); // Збереження змін тільки якщо все пройшло успішно
} catch {
_unitOfWork.Rollback(); // Відкат, якщо виникла помилка
}