# Применяемые технологии

## 1. Стек для легаси продуктов

### 1.1 Backend

#### Языки и платформы

| Технология       | Версия | Статус | Обоснование |
|------------------|--------|--------|-------------|
| C#               | -      | ✅ Поддерживать | Версия языка определяется используемой версией .NET |
| .NET Framework   | 4.8    | ✅ Поддерживать | Финальная версия платформы с поддержкой до 2028 года |

Обоснование: для легаси продуктов приоритетом является стабильность и минимизация рисков изменений. .NET Framework 4.8 является финальной версией платформы и будет поддерживаться Microsoft до 2028 года.

#### Базы данных

| Технология     | Статус | Обоснование |
|----------------|--------|-------------|
| MS SQL Server  | ⚠️ Мигрировать постепенно | Используется в легаси, при плановом рефакторинге рекомендуется переход на PostgreSQL |
| PostgreSQL     | ✅ Поддерживать | Универсальная production-ready СУБД с активным развитием и широкой поддержкой |
| SQL Compact    | ❗ Мигрировать  | Устаревшая БД, ограниченная функциональность и сильная зависимость от Windows |
| SQLite         | ✅ Поддерживать | Легковесная встраиваемая БД для локального хранения данных |

Обоснование: PostgreSQL рекомендуется как целевая платформа для новых и модернизируемых компонентов. SQL Compact признана устаревшей и требует поэтапной миграции без полного переписывания системы.

#### ORM и работа с БД

| Библиотека       | Версия | Статус | Обоснование |
|------------------|--------|--------|-------------|
| Entity Framework | -      | ✅ Поддерживать | Используется в проектах на .NET Framework, версия определяется поддерживаемой платформой |
| ADO.NET          | -      | ⚠️ Мигрировать постепенно | Прямая работа с БД в легаси системах без изменения архитектуры |

Обоснование: для легаси-систем допускается постепенный отказ от прямого использования ADO.NET в пользу Entity Framework. ADO.NET остается допустимым для сложных SQL-сценариев, bulk-операций и модулей без планового рефакторинга. Полный отказ от ADO.NET не является целью; приоритетом является повышение поддерживаемости кода без увеличения рисков и с сохранением возможности повторного использования наработок при дальнейшей модернизации системы.

#### Логирование

| Библиотека | Статус | Обоснование |
|------------|--------|-------------|
| Serilog    | ✅ Поддерживать | Современная библиотека, поддерживает структурированные логи, гибкие sinks, интеграцию с облачными и аналитическими системами (ELK, Seq, Splunk) |
| NLog       | ⚠️ Мигрировать постепенно | Рабочее решение для легаси, поддерживает различные targets, но уступает Serilog по структурированности и интеграции с современными системами |
| log4net    | ❗ Мигрировать | Устаревшая библиотека, сложно работать с разными типами вывода, не поддерживает современные аналитические стеки (например ELK), рекомендуется мигрировать на Serilog |

Обоснование: Для новых модулей и постепенной миграции рекомендуется Serilog — она обеспечивает структурированные логи, гибкие sinks, поддержку облачных и аналитических систем и упрощает централизованное логирование. Это повышает поддерживаемость и интеграцию кода, при этом не требует срочной полной переписки существующего логирования.

#### Сериализация

| Библиотека       | Статус | Обоснование |
|------------------|--------|-------------|
| Newtonsoft.Json  | ✅ Поддерживать | Замена не критична |
| Google.Protobuf  | ✅ Поддерживать | Эффективная бинарная сериализация |

**Обоснование:** Для легаси-систем Newtonsoft.Json остаётся стандартом сериализации. Замена на System.Text.Json не требуется, если нет критичных требований к производительности.

#### Протоколы и коммуникации

| Библиотека | Статус | Обоснование |
|------------|--------|-------------|
| M2Mqtt     | ⚠️ Рассмотреть обновление | Устаревающая библиотека MQTT, рекомендуется плановая замена на MQTTnet при модернизации системы |
| SSH.NET    | ✅ Поддерживать | Стабильная библиотека для работы по SSH, безопасно использовать в легаси |
| FluentFTP  | ✅ Поддерживать | Активно поддерживается, надежная реализация FTP |
| EGTS       | ✅ Поддерживать | Специфичный протокол для ГЛОНАСС, поддержка критична для существующих модулей |

**Обоснование:** M2Mqtt устаревает и имеет ограниченное развитие, поэтому для новых модулей или при рефакторинге рекомендуется использовать MQTTnet. Для существующих легаси систем текущая библиотека работает стабильно, срочной замены не требуется. Остальные протоколы остаются актуальными и безопасными для использования.

---

## 2. Стек для новых продуктов

### 2.1 Backend

#### Языки и платформы

| Технология    | Версия                        | Обоснование |
|---------------|-------------------------------|-------------|
| .NET          | 10 (LTS)                      | LTS-версия с долгосрочной поддержкой (до 14.10.2028), оптимальна для новых production-проектов |
| C#            | Актуальная (в составе .NET 10) | Синхронизирована с платформой, новые конструкции упрощают код |
| ASP.NET Core  | 10.x                          | Высокопроизводительный веб-фреймворк, стандарт для backend на .NET |

Обоснование: .NET 10 и C# 14 обеспечивают улучшенную производительность, кроссплатформенность, новые языковые конструкции, расширенные стандартные библиотеки и интеграцию с облаком и микросервисами. Долгосрочная поддержка снижает риски техдолга.

#### Базы данных

| Технология | Обоснование |
|------------|-------------|
| PostgreSQL | Универсальное решение |
| SQLite    | Лёгкая встроенная БД для локальных решений |

#### ORM и работа с БД

| Библиотека           | Версия                                 | Обоснование |
|----------------------|----------------------------------------|-------------|
| Entity Framework Core | Актуальная версия для используемой .NET платформы | Поддерживает последние возможности ORM, высокую производительность и совместимость с актуальными инструментами |

#### Логирование

| Библиотека | Версия | Обоснование |
|------------|--------|-------------|
| Serilog    | Актуальная версия для .NET 10 | Современное структурированное логирование, лёгкая интеграция с облачными и аналитическими системами (ELK, Seq, Splunk), поддержка централизованного логирования |

Обоснование: Serilog — стандарт для новых .NET проектов. Поддерживает структурированные логи, гибкие sinks и интеграцию с системами мониторинга, повышая удобство эксплуатации и поддерживаемость кода.

#### Сериализация

| Библиотека        | Обоснование |
|------------------|-------------|
| System.Text.Json  | Встроенная в .NET, высокая производительность |
| MemoryPack        | Для высокопроизводительной бинарной сериализации, оптимально при рефакторинге корпоративного протокола RITM |
| Google.Protobuf   | Эффективная бинарная сериализация, только по согласованию |

Обоснование: Для новых проектов рекомендуется использовать System.Text.Json как стандартную библиотеку сериализации: она встроена в .NET, быстрее Newtonsoft.Json, поддерживает современные конструкции Span/Memory и структурированные JSON-схемы. MemoryPack подходит для высокопроизводительных бинарных сценариев, в том числе при переходе с RITM.

#### Протоколы и коммуникации

| Библиотека | Обоснование                             |
| ---------- | --------------------------------------- |
| MQTTnet    | Современный MQTT клиент (вместо M2Mqtt) |
| SignalR    | Real-time коммуникация                  |
| NModbus    | Протокол Modbus)                        |

### Архитектурные паттерны и инструменты

#### CQRS / Mediator

| Библиотека       | Обоснование |
|-----------------|-------------|
| MediatR          | Реализация паттерна Mediator для разделения команд и запросов |
| ❓ TODO          | Рассмотреть переход в сторону бесплатного и поддерживаемого решения |

#### Валидация

| Библиотека       | Обоснование                                                                          |
| ---------------- | ------------------------------------------------------------------------------------ |
| FluentValidation | Fluent API для проверки сложных условий, повышает читаемость и поддерживаемость кода |
| ❓ TODO           | Рассмотреть библиотеки для реализации Result паттерна                               |

#### Маппинг / DTO

| Библиотека  | Обоснование |
|------------|-------------|
| AutoMapper | Автоматический маппинг объектов, уменьшает ручной код при трансформации DTO и моделей |
| ❓ Mapster | Быстрая и лёгкая альтернатива AutoMapper с source generators и меньшей конфигурацией |

> ❓ TODO: проверить Mapster, подходит ли для проектов, протестировать source generators и сложные сценарии маппинга

#### Устойчивость / Политики

| Библиотека | Обоснование |
|------------|-------------|
| Polly      | Реализация retry, circuit breaker и других политик устойчивости |

#### DI / Инъекция зависимостей

| Библиотека | Обоснование |
|------------|-------------|
| Microsoft.Extensions.DependencyInjection | Стандартный контейнер DI для .NET |
| Scrutor | Расширение для автоматической регистрации сервисов по соглашению, удобно для модульных проектов |

#### Хостинг и фоновые задачи

| Библиотека / Инструмент       | Обоснование |
|-------------------------------|-------------|
| Microsoft.Extensions.Hosting  | Управление жизненным циклом приложений, интеграция с DI и background-сервисами |
| IHostedService / BackgroundService | Простые фоновые задачи внутри приложения, периодичность через Timer/Task.Delay |
| Quartz.Extensions.Hosting     | Планировщик с гибким расписанием и поддержкой критичных задач |

> Обоснование использования:
> - **IHostedService / BackgroundService** — для простых фоновых задач, связанных с приложением.  
> - **Quartz** — для сложного расписания, устойчивости и управления job-ами.

#### Геопространственные данные

| Библиотека                | Обоснование |
|---------------------------|-------------|
| GMap.NET.Core             | Работа с картами и геоданными |
| GeoJSON.Net               | Работа с форматом GeoJSON |
| DotSpatial.Projections    | Работа с пространственными проекциями |
| NetTopologySuite          | Работа с геометрией и пространственными данными |

#### Тестирование

| Библиотека        | Обоснование |
|-------------------|-------------|
| xUnit                          | Фреймворк для unit-тестов |
| Moq                             | Создание моков для зависимостей |
| AutoFixture.Xunit               | Генерация тестовых данных |
| MockQueryable.Moq               | Моки для IQueryable |

---

## Заключение

- Для **легаси систем** главное — стабильность, постепенная миграция и сохранение существующих наработок.
- Для **новых проектов** — использовать современные, поддерживаемые технологии.