Полнофункциональный демонстрационный сервер на базе библиотеки Wattle.
Примечания.
- Сервер написан 100% на C# под .NET 9.
- Сборка и запуск тестов
- Проект DemoServer.Processing.Application.csproj при сборке использует PowerShell.
Из командной строки должен быть доступен запуск PWSH.exe - Для запуска тестов в классе Acme.DemoServer.Testing.BaseDbTests надо определить параметры подключения к PostgreSQL.
- Проект DemoServer.Processing.Application.csproj при сборке использует PowerShell.
- Все автоматические тесты сервера оформлены как NUnit-тесты для запуска в ОС Windows из-под Visual Studio 2022 (версии не ниже 17.8.1).
- Все БД PostgreSQL (версии не ниже 15) создаются и уничтожаются автоматически при запуске тестов.
- SQL-скрипт БД PostgreSQL создан из модели спроектированной с использованием Luna Modeler.
Модель БД PostgreSQL :
- Общее
- Доменный объект DemoDelayTask - хранимая в БД задача для фонового исполнения.
- Доменный объект DemoObject - доступен по REST интерфейсу.
- Доменный объект DemoObjectX - имеет составной альтернативный ключ.
- Реализован паттерн Unit of Work
- Пример 3-х видов проверки работоспособности сервера на основе шатного механизма Health checks in ASP.NET Core
- Пример как делать проверки без нагрузки на сервер при частых проверках.
- Пример как добавить в Swagger (OpenAPI) описание интерфейса проверки работоспособности.
- Пример автоматического создания контекста и оптимизированной модели контекста Entity Framework по существующей БД PostgreSQL с полным переписыванием предыдущих моделей (полезно если сущности БД удалены или переименованы) с учётом специфики партиционированных таблиц.
- Пример логирования с использованием serilog
- Интеграция с OpenTelemetry
- К примеру, для просмотра телементрии в онлайне укажите токен сайта lightstep.com с бесплатным доступом.
- Реализация REST интерфейса
- Тесты службы контроллера REST интерфейса
- Swagger описание REST интерфейса
- Созданы валидаторы DTO получаемых по REST интерфейсу
- Реализация высокоуровневого клиент REST интерфейса на базе RestSharp
- Интеграционные тесты REST интерфейса
- Интеграция с Entity Framework в рамках Unit of Work c тестами
- Пример логирующего прокси с поддержкой вызова асинхронных методов
- Пример интеграции с Telegram для оперативного уведомления об ошибках сервера и отправки диагностических сообщений
- На пример доменного объекта DemoDelayTask показана реализаци хранимой в БД задачи для фонового исполнения
- Показан пример полиморфного сценария выполнения задачи
- Показан пример циклического сценария выполнения задачи.
- Показана умная десериализация из текста JSON и умная сериализация в текст JSON - данный подход позволяет при десереализации текста JSON в объекты повторно и безопасно использовать раннее десериализованные объекты.
- Все задачи хранятся в БД в партиционированной таблице
- У задачи есть возможностью немедленного запуска (фоново) или отложенного запуска на указанную дату-время
- Задача сохраняется в БД и исполняется только при успешном подтверждении Unit of Work
- Задача начинает исполнение только после успешного подтверждения Unit of Work в котром она была создана
- При отмене Unit of Work задача в БД не сохраняется и не исполняется
- Все неисполненные задачи при рестарте в фоновом режиме автоматически загружаются из БД и ставятся на исполнение
- Задачи исполняются асинхронно
- Задачи можно исполнять повторно и менять дату-время отложенного (или немедленного) повторного запуска (в другом Unit of Work)
- Исполнение задачи можно немедленно отменить
- При аварийном исключении задача автоматически отправляется на повторную обработку с предварительных отстоем указанный интервал времени
- Для любой задачи можно получить обекта для асинхронного ожидания завершения (указанное время или бесконечно) исполнения
- Есть настройка для интервала ожидания по умолчанию если программист явно не указал интервал ожидания
- Есть произвольные настройки для обработчика задач
- При создании задач есть контроль лимита активных задач
- Можно игнорировать контроль лимита активных задач
- Каждая задача исполняется в своём автоматически созданном Unit of Work
- Стратегию создания Unit of Work можно переопределить
- Создан доменный объект DemoObject доступный по REST интерфейсу
- Реализован кэширующий маппер БД
- Данные в БД хранится в партиционированных таблицах
- Партиции БД создаются автоматически для каждого календарного дня
- Реализована оптимистическая конкуренция при обновлении на уровне БД
- Пример полей доменного объекта с типом хранения в БД PostgreSQL timestamp
- Реализована критическая секция при обновлении DemoObject
- При создании объекта показана стратегия определения успешности коммита Unit of Work
- Создан доменный объект DemoObjectX
- Реализован кэширующий маппер БД
- Пример произвольной выборки доменных объектов с использованием Entity Framework
- Пример использования столбца таблицы БД с именем в кавычках
- Пример полей доменного объекта с типом хранения в БД PostgreSQL timestamptz
- Реализована оптимистическая конкуренция при обновлении на уровне БД
- Реализована критическая секция при обновлении и создании DemoObjectХ
- При создании объекта показана стратегия определения успешности коммита Unit of Work
- Показана реализация реестра идентити объектов - механизма полного кэшированияв в памяти (с фоновым прогревом) идентификаторов и альтернативных ключей доменных объектов для минимизации и даже полного исключения обращений к БД
- Показано удаление объектов
- Реализован составной альтернативный ключ на уровне БД и на уровне кода
- Реализовано создание объекта с проверкой уникальности альтернативного ключа на уровне кода (с минимальным и даже без обращения к БД)
- Создан интерфейс поиска по альтернативному ключу (с минимальным и даже без обращения к БД)
- Реализовано понятие группы объектов объединенных константным признаком
- Создан интерфейс поиска коллекции объектов по значению группы (с минимальным и даже без обращениея к БД)