Skip to content

nestelia 提供完整的依赖注入系统。服务在模块中注册,并自动注入到控制器和其他服务中。

@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";

// 默认 — 全局共享一个实例
@Injectable()
class SingletonService {}

// 每次注入时创建新实例
@Injectable({ scope: Scope.TRANSIENT })
class TransientService {}

// 每个 HTTP 请求创建新实例(通过 AsyncLocalStorage)
@Injectable({ scope: Scope.REQUEST })
class RequestScopedService {}
作用域行为
SINGLETON整个应用程序共享单一实例(默认)
TRANSIENT每次注入时创建新实例
REQUEST每个 HTTP 请求创建新实例

注册提供者

提供者在模块的 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 许可证发布。