> ## 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.

# なぜ Wyrly?

> Wyrly DI の設計判断。

多くの TypeScript DI ライブラリは、legacy decorators、`reflect-metadata`、
`emitDecoratorMetadata` を前提に設計されてきました。

Wyrly は別のアプローチを取ります。依存関係は明示的で、トークンは型付きで、コアパッケージ
は Web フレームワークに依存しません。

## 設計目標

* TypeScript 標準デコレーターで動く
* `reflect-metadata` を避ける
* `emitDecoratorMetadata` を避ける
* parameter decorators を避ける
* 依存関係を明示的でレビューしやすい形にする
* リクエストスコープの Web アプリケーションをサポートする
* ドメインとアプリケーションコードをフレームワーク非依存に保つ
* CI やツール向けに依存グラフの検査機能を提供する

## DDD と Clean Architecture

DDD や Clean Architecture のコードベースでは、application services が port に依存することがよくあります。

```ts theme={null}
interface PaymentGateway {
  authorize(command: AuthorizePayment): Promise<PaymentAuthorization>;
}
```

Wyrly では、その依存関係を型付きトークンとしてモデル化し、composition root でインフラアダプターにバインドできます。

これにより、ドメイン言語をコードの近くに保ちながら、内側の層からデータベース、HTTP クライアント、SDK、フレームワーク API への import を避けられます。

## 暗黙的な自動化より明示性

Wyrly は意図的に依存宣言を必要とします。

```ts theme={null}
@Injectable({ deps: [UserRepositoryToken] })
class GetUserUseCase {
  constructor(private readonly users: UserRepository) {}
}
```

この 1 行により、依存グラフが人間にもツールにも見えるようになります。また、ランタイムやバンドラーによって挙動が変わる実行時メタデータへの依存も避けられます。

## Request scopes

Web アプリでは、1 リクエストにつき 1 つの依存スコープが必要になることがよくあります。Wyrly はコアパッケージでスコープ付きライフタイムをサポートし、主要フレームワーク向けに薄いアダプターを提供します。

リクエストスコープは次のような用途に使います。

* リクエストコンテキスト
* 認証済みユーザーコンテキスト
* unit-of-work オブジェクト
* DataLoader インスタンス
* リクエストローカルなキャッシュ
* 破棄が必要なリソース
