active: true
derived: false
groups:
- DI
header: |
  依存注入構成
level: 2.12
links:
- REQ012: P4XTpsGbx526S9Pqi4KlGuEXCnwq--i4Y_CD7cK5BQA=
normative: true
ref: ''
reviewed: wyd0qYs3glQxcj5FTeBeNWbxswZrwWoZ8-5nZh_5IyU=
text: |
  ## コンポーネント構成

  ```mermaid
  graph TD
    A[bs.Spot Factory] -->|構築| B[core.Spot]
    A -->|DI| C[TaskDBBase]
    A -->|DI| D[BlobStorageBase]
    A -->|DI| E[SerializerProtocol]
    A -->|DI| F[StoragePolicyProtocol]
    A -->|DI| G[LimiterProtocol]
  ```

  ## コンポーネント責務

  | コンポーネント | 責務 | インターフェース |
  |---|---|---|
  | bs.Spot (Factory) | 環境（名前、パス等）に応じたデフォルトコンポーネントの選定と組み立て | `bs.Spot()` |
  | core.Spot | 注入された依存関係を使用して、キャッシュロジックをオーケストレーションする | `mark()`, `cached_run()` |
  | Protocols / ABCs | 各コンポーネントが満たすべき契約（インターフェース）の定義 | `SerializerProtocol` 等 |

  ## 技術選定

  | 技術領域 | 選定 | 理由 |
  |---|---|---|
  | パターン | Constructor Injection | 依存関係を明示的に渡し、テスト時のMock差し替えを容易にする |
  | インターフェース | Protocol (Duck Typing) | 厳密な継承を強制せず、構造的部分型によりサードパーティ実装を受け入れ |
  | デフォルト設定 | 規約より構成 (CoC) | `.beautyspot/` ディレクトリを基点とした標準パスを自動生成 |

  ## 非機能要件方針

  - **結合度**: `core.Spot` は具体的なクラス名（SQLite等）を知らず、Protocolのみに依存する
  - **テスト容易性**: メモリ上のDBや仮装ストレージを注入することで、高速な単体テストが可能
  - **拡張性**: ユーザーが独自のシリアライザやストレージを自作して注入可能

  ## 設計根拠

  エンドユーザーへの「ゼロ設定で動く使いやすさ」と「高度なカスタマイズ性」を両立するため。ファクトリ関数（bs.Spot）でデフォルトコンポーネントを自動ワイヤリングしつつ、個別のProtocol実装の差し替えを許容する構成とした。
