Skip to content

Arsenk0/DotNet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


.NET Backend Architecture Showcase

Цей репозиторій є прикладом реалізації різних підходів до побудови бекенду на .NET 9. Рішення складається з трьох незалежних проєктів, кожен з яких демонструє специфічні патерни доступу до даних (SQL vs NoSQL), архітектурні стилі (Clean Architecture, CQRS) та бібліотеки.

📂 Структура проєкту

Рішення розділене на три основні сервіси:

1. CatalogApp (SQL / EF Core)

Класичний REST API для управління каталогом товарів.

  • База даних: SQLite (catalog.db).
  • ORM: Entity Framework Core.
  • Архітектура: N-Layer architecture.
  • Ключові патерни:
  • Repository & Generic Repository: Абстракція доступу до даних.
  • Specification Pattern: Динамічна побудова запитів (фільтрація, сортування, пагінація) без засмічення контролерів.
  • Global Exception Middleware: Централізована обробка помилок.

2. CatalogApp.Mongo (NoSQL / CQRS)

Сервіс відгуків та рейтингів, оптимізований для великої кількості операцій читання/запису.

  • База даних: MongoDB.
  • Підхід: CQRS (Command Query Responsibility Segregation).
  • Бібліотеки: MediatR (для реалізації команд і запитів), MongoDB Driver.
  • Ключові особливості:
  • Vertical Slices: Кожна фіча (наприклад, CreateReview, GetProductStats) має свою власну папку з хендлером, командою та валідатором.
  • Aggregation Pipeline: Використання агрегацій MongoDB для розрахунку середнього рейтингу.
  • Nested Documents: Збереження коментарів всередині документу відгуку.

3. CatalogApp.AdoDapper (High Performance / SQL)

Сервіс замовлень, де критична швидкість та контроль над транзакціями.

  • База даних: 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)

Крок 1: Запуск інфраструктури

Переконайтеся, що у вас запущені контейнери для Postgres та Mongo (або локальні сервери).

  • PostgreSQL: Connection string очікує порт 5432, user arsenkhomiak, database orders_db.
  • MongoDB: Connection string очікує mongodb://localhost:27017.

Крок 2: Запуск проєктів

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

📚 Приклади коду

Патерн Специфікація (EF Core)

Дозволяє чисто описувати бізнес-логіку вибірки даних:

// Пошук товарів за критеріями, включення категорій та пагінація
var spec = new ProductWithCategorySpecification(productParams);
var products = await _productsRepo.ListAsync(spec);

MediatR Handler (CQRS)

Ізольована логіка обробки однієї команди (створення відгуку):

public async Task<Review> Handle(CreateReviewCommand request, CancellationToken ct)
{
    var newReview = new Review { ... };
    await _reviews.InsertOneAsync(newReview, cancellationToken: ct);
    return newReview;
}

Unit of Work (Dapper)

Управління транзакцією при створенні замовлення:

try {
    _unitOfWork.BeginTransaction();
    var orderId = _unitOfWork.Orders.Create(order);
    _unitOfWork.Commit(); // Збереження змін тільки якщо все пройшло успішно
} catch {
    _unitOfWork.Rollback(); // Відкат, якщо виникла помилка
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages