メインコンテンツへスキップ

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.

多くの TypeScript DI ライブラリは、legacy decorators、reflect-metadataemitDecoratorMetadata を前提に設計されてきました。 Wyrly は別のアプローチを取ります。依存関係は明示的で、トークンは型付きで、コアパッケージ は Web フレームワークに依存しません。

設計目標

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

DDD と Clean Architecture

DDD や Clean Architecture のコードベースでは、application services が port に依存することがよくあります。
interface PaymentGateway {
  authorize(command: AuthorizePayment): Promise<PaymentAuthorization>;
}
Wyrly では、その依存関係を型付きトークンとしてモデル化し、composition root でインフラアダプターにバインドできます。 これにより、ドメイン言語をコードの近くに保ちながら、内側の層からデータベース、HTTP クライアント、SDK、フレームワーク API への import を避けられます。

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

Wyrly は意図的に依存宣言を必要とします。
@Injectable({ deps: [UserRepositoryToken] })
class GetUserUseCase {
  constructor(private readonly users: UserRepository) {}
}
この 1 行により、依存グラフが人間にもツールにも見えるようになります。また、ランタイムやバンドラーによって挙動が変わる実行時メタデータへの依存も避けられます。

Request scopes

Web アプリでは、1 リクエストにつき 1 つの依存スコープが必要になることがよくあります。Wyrly はコアパッケージでスコープ付きライフタイムをサポートし、主要フレームワーク向けに薄いアダプターを提供します。 リクエストスコープは次のような用途に使います。
  • リクエストコンテキスト
  • 認証済みユーザーコンテキスト
  • unit-of-work オブジェクト
  • DataLoader インスタンス
  • リクエストローカルなキャッシュ
  • 破棄が必要なリソース