Skip to content

nestelia はフルの依存性注入システムを提供します。サービスはモジュールに登録され、コントローラーや他のサービスに自動的に注入されます。

@Injectable()

クラスを injectable としてマークし、DI コンテナが管理できるようにします:

typescript
import { Injectable } from "nestelia";

@Injectable()
class UserService {
  findAll() {
    return [{ id: 1, name: "John" }];
  }
}

@Inject()

コンストラクタで依存トークンを明示的に指定します:

typescript
@Controller("/users")
class UserController {
  constructor(@Inject(UserService) private readonly userService: UserService) {}
}

@Optional()

依存関係をオプションとしてマークします — 利用できない場合は undefined を返します:

typescript
constructor(
  @Inject("ANALYTICS") @Optional() private analytics?: AnalyticsService
) {}

スコープ

スコープでサービスのライフサイクルを制御します:

typescript
import { Injectable, Scope } from "nestelia";

// デフォルト — どこでも共有される 1 つのインスタンス
@Injectable()
class SingletonService {}

// 注入のたびに新しいインスタンス
@Injectable({ scope: Scope.TRANSIENT })
class TransientService {}

// HTTP リクエストごとに新しいインスタンス (AsyncLocalStorage 経由)
@Injectable({ scope: Scope.REQUEST })
class RequestScopedService {}
スコープ動作
SINGLETONアプリケーション全体で 1 つのインスタンス (デフォルト)
TRANSIENT注入のたびに新しいインスタンス
REQUESTHTTP リクエストごとに新しいインスタンス

プロバイダーの登録

プロバイダーはモジュールの providers 配列に登録します:

typescript
@Module({
  controllers: [UserController],
  providers: [UserService, DatabaseService],
})
class UserModule {}

プロバイダーのエクスポート

プロバイダーを他のモジュールで利用可能にするには exports に追加します:

typescript
@Module({
  providers: [DatabaseService],
  exports: [DatabaseService],
})
class DatabaseModule {}

@Module({
  imports: [DatabaseModule],
  controllers: [UserController],
  providers: [UserService], // DatabaseService をインジェクトできる
})
class UserModule {}

カスタムプロバイダー

バリュー、クラス、ファクトリー、エイリアスプロバイダーについてはカスタムプロバイダーページを参照してください。

循環依存

forwardRef() を使った循環依存の解決についてはフォワードリファレンスページを参照してください。

MIT ライセンスの下で公開されています。