このプロジェクトについて
概要
このリポジトリ「sqlite-multi-tenant」は、.NET向けのマルチテナントSQLiteデータベースマネージャーです(リポジトリのメタデータでは、テナントごとの分離、マイグレーション、バックアップを提供すると記載されています)。READMEはクラスごとのリファレンス形式となっており、各セクションでサービス、ヘルパー、またはバリデーターについて説明し、C#の使用例を挙げています。これはクイックスタートガイドではなくAPIドキュメントとして記述されているため、以下の内容はREADMEで実際に実演されている内容を反映しています。
マルチテナンシー戦略
READMEのエンドツーエンド分離テストでは、サポートされている2つのアプローチについて説明しています:
- Connection-per-tenant(テナントごとの接続):各テナントが独自の物理的なSQLiteファイルを持ち、ファイルレベルの分離を実現します。テナントの接続文字列はそのテナントのデータベースのみを指します。
- Shared-schema(共有スキーマ):すべてのテナントが単一のSQLiteファイルを共有し、TenantId識別子列によってすべてのクエリをスコープ化することで、各テナントが自身の行のみを読み書きできるようにします。
分離テストは、どちらのモデルにおいてもテナントが他のテナントの行を読み取り、更新、または削除できないことを確認する、意図的に敵対的なチェックとして提示されています。サンプルテストコードでは、テナントごとの一時データベースファイルを作成し、テナントタグ付きのドキュメントを挿入し、TenantIdフィルターでクエリを行うと、そのテナントのタイトルのみが返されることをアサートします。複数のテナントの行を含む共有ファイルについても同様のパターンが示されています。サンプルのヘルパーメソッドでは、接続文字列の構築、Id、TenantId、Title列を持つDocumentsテーブルの作成、パラメータ化されたコマンドによる行の挿入、およびテナントでフィルタリングされたタイトルの読み取りが行われます。
整合性チェック
IntegrityCheckServiceは、テナントデータベース全体でSQLiteのPRAGMA integrity_check操作を実行します。ドキュメント化されているエントリポイントは以下の通りです:
- IDによる単一テナントのチェック。
- 明示的なテナントリストのチェック(maxDegreeOfParallelism引数付き)。
- システム内の全テナントのチェック(こちらも並列数設定可能)。
- アクティブなテナントのみのチェック。
結果は、少なくともTenantIdとIsOkを公開するTenantIntegrityCheckResultオブジェクトとして返されます。設定可能な並列処理は、検証中のシステム負荷を管理する方法として提示されています。
テナントコンテキストヘルパー
TenantContextHelperExtensionsは、マルチテナントスコープ内で動作するための拡張メソッドをTenantContextHelperに追加します。READMEでは以下が示されています:現在のテナントがターゲットIDと一致するかどうかの確認、テナントIDとユーザーIDを保持できる検証済みスコープの作成(usingブロックで使用)、必要なテナントコンテキストの取得、必要なテナントIDの直接取得、および指定されたテナントコンテキスト内でのアクションまたは値返却関数の実行。これらは、テナントを意識したコードパスにおける繰り返しの定型処理を削減することを目的としています。
ミドルウェア検証
2つのバリデーターがドキュメント化されています:
- RateLimitingMiddlewareValidationは、RateLimitingMiddlewareインスタンス、RateLimitingConfigオブジェクト(MaxRequestsPerSecond、MaxBurst、WindowSize、Enabled、BanDurationなどのフィールドを含む)、RateLimitExceededResult(IsExceeded、RetryAfter、CurrentRequestCount、Limit、Window)、およびRateLimitStatistics(TotalRequests、AllowedRequests、DeniedRequests、PeakRequestsPerSecond、CurrentActiveLimits)を検証します。各オーバーロードについて、READMEではValidateが問題文字列のリストを返し、IsValidがブール値を返し、EnsureValidが入力が無効な場合に例外をスローすることを示しています。ワークフロー例では、使用前にミドルウェア設定を検証し、結果として生じる引数例外をキャッチします。
- ErrorHandlingMiddlewareValidationは、ErrorHandlingMiddlewareインスタンスとResultオブジェクトを検証する拡張メソッドを提供します。null参照、成功フラグとエラーメッセージの一貫性、および成功した結果がデフォルト値以外の値を保持しているかを確認します。ドキュメント化されたインターフェースは、ミドルウェアに対するValidate、IsValid、EnsureValid、およびResult値に対する同様の3つのメソッドであり、リクエストパイプラインの早い段階で不変条件を強制できます。
設定アクセス
SettingsControllerExtensionsは、SettingsControllerに強型付けおよびバッチ操作を追加します。ドキュメント化されたメソッドには以下が含まれます:設定を具体的な型として読み取る(オプションでDateTimeなどのカスタム解析関数を使用)、強型付けされた値の書き込み、設定辞書の一括更新、設定の存在確認、および述語でフィルタリングされた設定の取得(設定値のリストを返す)。結果は、例の中のOkObjectResultチェックに示されているように、Dataペイロードを持つAPIレスポンスオブジェクトにラップされます。
シリアル化ユーティリティ
- ReportGeneratorJsonExtensionsは、監視データ(ヘルスサマリー、操作統計、パフォーマンスメトリクス)のためのSystem.Text.Jsonシリアル化をラップします。書き込み用のToJson、統計読み取り用のFromJsonToOperationStatistics、およびブール値の成功結果を伴うパフォーマンスメトリクス用のTryFromJsonがドキュメント化されています。
- StringUtilitiesJsonExtensionsは文字列のシリアル化およびデシリアル化を行い、SHA256ハッシュの付加やsnake_caseへの変換を行うバリアントに加え、例外をスローせずに成功を報告するtry-deserializeメソッドを提供します。
テストユーティリティ
TenantNameValidatorTestsExtensionsは、テナント名の検証のためのアサーション形式のヘルパーを提供します:名前が期待される正規化されたテナント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.