Об этом проекте
Обзор
Данный репозиторий, sqlite-multi-tenant, представляет собой менеджер многоарендных баз данных SQLite для .NET (в метаданных репозитория указано, что он обеспечивает изоляцию арендаторов, миграции и резервное копирование). README представляет собой справочник по классам: каждый раздел документирует одну службу, помощник или валидатор и иллюстрирует их примерами использования на C#. Он написан как документация к API, а не как руководство по началу работы, поэтому приведенный ниже материал отражает то, что фактически демонстрируется в README.
Стратегии многоарендности
В сквозных тестах изоляции в README описываются два поддерживаемых подхода:
- Connection-per-tenant (соединение на арендатора): каждый арендатор имеет собственный физический файл SQLite, что обеспечивает изоляцию на уровне файла. Строка подключения арендатора указывает только на базу данных этого арендатора.
- Shared-schema (общая схема): все арендаторы используют один файл SQLite, а столбец-дискриминатор TenantId ограничивает каждый запрос так, чтобы каждый арендатор мог читать или записывать только свои строки.
Тесты изоляции представлены в виде намеренно «враждебных» проверок того, что арендатор не может прочитать, обновить или удалить строки другого арендатора ни в одной из моделей. Пример тестового кода создает временные файлы баз данных для каждого арендатора, вставляет документы с метками арендаторов и утверждает, что запрос с фильтром TenantId возвращает только заголовки этого арендатора. Аналогичный паттерн показан для общего файла, содержащего строки для нескольких арендаторов. Вспомогательные методы в примерах создают строки подключения, создают таблицу Documents со столбцами Id, TenantId и Title, вставляют строки с помощью параметризованных команд и считывают заголовки, отфильтрованные по арендатору.
Проверка целостности
IntegrityCheckService выполняет операции SQLite PRAGMA integrity_check в базах данных арендаторов. Документированные точки входа:
- Проверка одного арендатора по id.
- Проверка явного списка арендаторов с аргументом maxDegreeOfParallelism.
- Проверка всех арендаторов в системе, также с настраиваемым параллелизмом.
- Проверка только активных арендаторов.
Результаты выводятся в виде объектов TenantIntegrityCheckResult, содержащих как минимум TenantId и IsOk. Настраиваемый параллелизм представлен как способ управления нагрузкой на систему во время валидации.
Помощники контекста арендатора
TenantContextHelperExtensions добавляет методы расширения к TenantContextHelper для работы внутри многоарендных областей. В README показано: проверка соответствия текущего арендатора целевому id, создание валидированной области (scope), которая может переносить id арендатора и id пользователя и используется в блоке using, получение требуемого контекста арендатора, получение id арендатора напрямую, а также выполнение действия или функции с возвращаемым значением внутри указанного контекста арендатора. Эти методы направлены на сокращение повторяющегося шаблонного кода в путях выполнения, учитывающих арендатора.
Валидация Middleware
Документированы два валидатора:
- RateLimitingMiddlewareValidation валидирует экземпляр RateLimitingMiddleware, объект RateLimitingConfig (с такими полями, как MaxRequestsPerSecond, MaxBurst, WindowSize, Enabled и BanDuration), RateLimitExceededResult (IsExceeded, RetryAfter, CurrentRequestCount, Limit, Window) и RateLimitStatistics (TotalRequests, AllowedRequests, DeniedRequests, PeakRequestsPerSecond, CurrentActiveLimits). Для каждой перегрузки в README показано, что Validate возвращает список строк с проблемами, IsValid возвращает логическое значение, а EnsureValid выбрасывает исключение при невалидных входных данных. Пример рабочего процесса демонстрирует валидацию конфигурации middleware перед использованием и перехват результирующего исключения аргумента.
- ErrorHandlingMiddlewareValidation предоставляет методы расширения для валидации экземпляра ErrorHandlingMiddleware и объектов Result. Он проверяет ссылки на null, согласованность между флагами успеха и сообщениями об ошибках, а также то, что успешные результаты содержат значение, отличное от значения по умолчанию. Документированный интерфейс включает Validate, IsValid и EnsureValid для middleware, а также те же три метода для значений Result, чтобы инварианты могли быть принудительно соблюдены на ранних этапах конвейера запросов.
Доступ к настройкам
SettingsControllerExtensions добавляет строго типизированные и пакетные операции в SettingsController. Документированные методы включают: чтение настройки как конкретного типа, опционально с пользовательской функцией парсинга (например, для DateTime); запись строго типизированного значения; обновление словаря настроек одним пакетным вызовом; проверку существования настройки; и получение настроек, отфильтрованных по предикату, с возвратом списка значений настроек. Результаты обернуты в объект ответа API с полезной нагрузкой Data, что подтверждается проверками OkObjectResult в примерах.
Утилиты сериализации
- ReportGeneratorJsonExtensions оборачивает сериализацию System.Text.Json для данных мониторинга: сводок состояния, статистики операций и метрик производительности. Документированы методы ToJson для записи, FromJsonToOperationStatistics для чтения статистики и TryFromJson для метрик производительности с возвратом логического значения успеха.
- StringUtilitiesJsonExtensions сериализует и десериализует строки с вариантами, которые добавляют хеш SHA256 или конвертируют в snake_case, а также метод try-deserialize, который сообщает об успехе без выброса исключения.
Утилиты тестирования
TenantNameValidatorTestsExtensions предоставляет вспомогательные методы в стиле утверждений (assertions) для валидации имен арендаторов: проверка того, что имя соответствует ожидаемому нормализованному id арендатора, что имя считается допустимым id арендатора, что недопустимое имя вызывает конкретное ожидаемое сообщение об ошибке, и перечисление встроенных коллекций недопустимых id арендаторов с их ошибками и допустимых сопоставлений имени и id. Эти методы предназначены для повторного использования в тестовых наборах.
Примечания для оценки
README представляет собой документацию отдельных API с фрагментами использования; в нем отсутствуют инструкции по установке, имена пакетов, поддерживаемые версии .NET, пошаговые руководства по миграции или резервному копированию, а также сведения о лицензии и участии, хотя миграции и резервное копирование упоминаются в описании репозитория. Примеры ссылаются на такие пространства имен, как SqliteMultiTenant.Services, SqliteMultiTenant.Models, SqliteMultiTenant.Utilities, SqliteMultiTenant.Middleware, SqliteMultiTenant.Monitoring, SqliteMultiTenant.Validation и SqliteMultiTenant.Api.Controllers, и зависят от System.Data.SQLite и тестового фреймворка. Читателям следует рассматривать примеры как иллюстративные и подтверждать текущие API, упаковку и гарантии изоляции по исходному коду перед их внедрением. Повторяющиеся блоки в конце README указывают на наличие дублирования в самом документе.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.