您需要结合使用 Modules 和 Providers 以“嵌套方式”执行此操作,然后您可以在整个应用中使用依赖注入。
一般来说,您添加 3rd 方库的方式如下:
- 创建一个模块来包装您的库,例如“CryptoManagerModule”。
- 创建一个提供 CCXT 库的自定义提供程序,并将其添加到您的
providers 数组中。
- 创建服务“CryptoManagerService”,并将 CCXT 注入构造函数。
- 从您的模块中导出“CryptoManagerService”,以便您可以将其注入应用的其余部分。
- (可选)将您的模块标记为“全局”,这样您只需在 AppModule 中配置该模块一次,即可使其可用于所有其他模块。
内部crypto-manager.module.ts
import { DynamicModule, Module, Provider } from '@nestjs/common';
import { CryptoManagerService } from './crypto-manager.service';
import * as ccxt from 'ccxt';
// Add any config options you need, like API keys, etc
export interface CryptoManagerModuleOptions {
global?: boolean;
}
export const KRAKEN_CLIENT_TOKEN = 'KRAKEN_CLIENT_TOKEN';
export class CryptoManagerModule {
static forRoot(options: CryptoManagerModuleOptions): DynamicModule {
// An example of injecting a single class of ccxt. Note this is only available
// within this module.
const krakenProvider: Provider = {
provide: KRAKEN_CLIENT_TOKEN,
useValue: new ccxt.kraken(),
};
return {
module: CryptoManagerModule,
providers: [krakenProvider, CryptoManagerService],
// Exports can be @Inject()'ed to other files, and if global
// is set, then forRoot only needs to be called in the AppModule
exports: [CryptoManagerService],
global: options.global,
};
}
}
内部crypto-manager.service.ts
import { Inject, Injectable } from '@nestjs/common';
import { KRAKEN_CLIENT_TOKEN } from './crypto-manager.module';
import { kraken } from 'ccxt';
@Injectable()
export class CryptoManagerService {
constructor(@Inject(KRAKEN_CLIENT_TOKEN) private kraken: kraken) {}
loadKrakenMarkets() {
return this.kraken.loadMarkets();
}
}
内部app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CryptoManagerModule } from './crypto-manager/crypto-manager.module';
@Module({
controllers: [AppController],
providers: [AppService],
// Make sure to call forRoot
imports: [CryptoManagerModule.forRoot({ global: true })],
})
export class AppModule {}
最后,在app.service.ts 中使用它的一个例子。我没有对这个文件做任何特别的事情,你只会看到记录到控制台的结果。
import { Inject, Injectable } from '@nestjs/common';
import { CryptoManagerService } from './crypto-manager/crypto-manager.service';
@Injectable()
export class AppService {
constructor(private cryptoManagerService: CryptoManagerService) {}
getHello(): string {
this.cryptoManagerService.loadKrakenMarkets().then(console.log);
return 'Hello World!';
}
}
这样做可以让您在测试时轻松地模拟出kraken,允许您在 forRoot 中传递配置变量以防您想跨项目重用它,并且这种模式在已经是 Nest 社区了。