Skip to content

除了简单的类提供者之外,nestelia 还支持多种自定义提供者类型,用于高级依赖注入场景。

类提供者

最简单的形式——DI 容器实例化该类:

typescript
@Module({
  providers: [UserService], // { provide: UserService, useClass: UserService } 的简写
})
class AppModule {}

你也可以用一个类替换另一个类:

typescript
@Module({
  providers: [
    { provide: DatabaseService, useClass: PostgresService },
  ],
})
class AppModule {}

值提供者

提供一个静态值(对象、字符串、数字等):

typescript
@Module({
  providers: [
    { provide: "CONFIG", useValue: { port: 3000, debug: true } },
    { provide: "API_KEY", useValue: "sk-abc123" },
  ],
})
class AppModule {}

使用字符串令牌注入:

typescript
@Injectable()
class ApiService {
  constructor(@Inject("API_KEY") private apiKey: string) {}
}

工厂提供者

使用函数创建提供者实例。该函数可以注入其他依赖:

typescript
@Module({
  providers: [
    ConfigService,
    {
      provide: "DATABASE",
      useFactory: (config: ConfigService) => {
        return createDatabaseConnection(config.get("DATABASE_URL"));
      },
      inject: [ConfigService],
    },
  ],
})
class AppModule {}

支持异步工厂:

typescript
{
  provide: "DATABASE",
  useFactory: async (config: ConfigService) => {
    const connection = await createConnection(config.get("DATABASE_URL"));
    await connection.migrate();
    return connection;
  },
  inject: [ConfigService],
}

别名提供者(useExisting)

创建指向现有提供者的别名:

typescript
@Module({
  providers: [
    PostgresService,
    { provide: "DATABASE", useExisting: PostgresService },
  ],
})
class AppModule {}

PostgresService"DATABASE" 都解析为同一个单例实例。

组合提供者类型

typescript
@Module({
  providers: [
    // 类
    UserService,
    AuthService,

    // 值
    { provide: "CONFIG", useValue: { port: 3000 } },

    // 工厂
    {
      provide: "LOGGER",
      useFactory: (config: any) => new Logger(config.level),
      inject: ["CONFIG"],
    },

    // 类替换
    { provide: DatabaseService, useClass: PostgresService },

    // 别名
    { provide: "DB", useExisting: DatabaseService },
  ],
})
class AppModule {}

导出自定义提供者

要使自定义提供者对其他模块可用:

typescript
@Module({
  providers: [
    { provide: "CONFIG", useValue: { port: 3000 } },
    ConfigService,
  ],
  exports: ["CONFIG", ConfigService],
})
class SharedModule {}

基于 MIT 许可证发布。