> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wyrly.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Core model

> Wyrly DI の中核となるオブジェクト: トークン、プロバイダー、コンテナ、スコープ、ライフタイム。

Wyrly の core model は小さく保たれています。ほとんどの application で必要なのは、tokens、
providers、containers、scopes、lifetimes の 5 つです。

## Tokens

トークンは TypeScript の型を持つ実行時のキーです。

```ts theme={null}
const UserRepositoryToken = token<UserRepository>("UserRepository");
```

インターフェースや抽象的な機能にはトークンを使います。クラス自体が依存のキーになる場合は、クラスのコンストラクタを直接登録することもできます。

## Providers

プロバイダーは、依存関係をどのように作成または返すかをコンテナに伝えます。

Wyrly は以下に対応しています。

* クラスで実装された依存関係向けの `useClass`
* 定数やテストダブル向けの `useValue`
* カスタム生成が必要な依存関係向けの `useFactory`
* エイリアス向けの `useExisting`

## Containers

ルートコンテナはアプリケーション全体の登録を管理します。

```ts theme={null}
const container = createContainer();
container.register(UserRepositoryToken, {
  useClass: PrismaUserRepository,
  lifetime: "scoped",
});
```

ルートコンテナは composition root として扱います。ドメインや use case のコードの中ではなく、そこに具体的なインフラ実装を登録してください。

## Scopes

スコープは子の依存解決コンテキストです。Web アプリでは、アダプターが通常 1 リクエストにつき 1 スコープを作ります。

```ts theme={null}
const scope = container.createScope();
try {
  const service = scope.resolve(MyService);
} finally {
  await scope.dispose();
}
```

スコープ付きの依存関係は同じスコープ内で再利用され、スコープが破棄されると一緒に破棄されます。

## Lifetimes

| Lifetime    | Meaning                       |
| ----------- | ----------------------------- |
| `singleton` | root container につき 1 instance |
| `scoped`    | scope につき 1 instance          |
| `transient` | resolution ごとに新しい instance    |

依存関係の状態とリソースの所有権に合う、最も狭いライフタイムを選んでください。

## Validation

本番環境に出す前に依存グラフの問題を検出するには、`container.validate()` を使います。

* プロバイダーの不足
* 循環依存
* 不正なプロバイダー定義
* ライフタイム違反

検証は依存の組み立てを検査可能な成果物にできるため、CI で特に有用です。
