gpt4 book ai didi

dependency-injection - NestJs:动态创建类的实例

转载 作者:行者123 更新时间:2023-12-04 15:33:23 26 4
gpt4 key购买 nike

我想在 NestJs 中动态创建类实例,而不是单例。

我找到了两种方法:

1)直接创建类(ChripSensor就不是@Injectable)

import { ChirpSensor } from './chirp-sensor/chirp-sensor';

@Injectable()
export class SensorsService {
registeredSensors: any;
constructor(
@InjectModel('Sensor') private readonly sensorModel: Model<ISensor>,
private i2cService: I2cService) {
const sensors = this.i2cService.getSensors();
sensors.forEach((sensor) => {this.registeredSensors[sensor._id] = new ChirpSensor({name: sensor.name})});

}

我想知道这是否与nest.js的DI方式一致

2) 第二种解决方案是通过 factory ,但在这里我不知道如何传递选项。
export const chirpFactory = {
provide: 'CHIRP_SENSOR',
useFactory: (options) => {
console.log('USING FACTORY CHIRP, options', options)
if (process.env.SIMULATION === 'true') {
return new ChirpSensorMock(options);
}
else {
return new ChirpSensor(options);
}
}
};

不太确定如何在此处继续/正确注入(inject)工厂,因为示例在没有选项的情况下在构造函数中创建对象?

题:

什么是 NestJs创建这些类实例的方法?

编辑 - 对于 B12Toastr

模块 - 在编译时获取 Mock 或 Original
providers: [
{
provide: 'CHIRP_SENSOR',
useValue: process.env.SIMULATION === 'true'
? ChirpSensorMock
: ChirpSensor
},
],

传感器服务
@Injectable()
export class SensorsService {
registeredSensors: any;
constructor(
@Inject('CHIRP_SENSOR') private ChirpSensorClass: any, // any works but ChirpSensorMock | ChirpSensor not
private i2cService: I2cService
) {
const sensors = this.i2cService.getSensors();
sensors.forEach((sensor) => {this.registeredSensors[sensor._id] = new ChirpSensorClass({name: sensor.name})});

}

最佳答案

您可以通过 DI 通过 useValue 将选项传递给您的工厂或 useClass

providers: [
{
provide: MyOptions,
useValue: options
},
{
provide: 'CHIRP_SENSOR',
useFactory: (options: MyOptions) => {
console.log('USING FACTORY CHIRP, options', options);
if (process.env.SIMULATION === 'true') {
return new ChirpSensorMock(options);
} else {
return new ChirpSensor(options);
}
},
},
],

或者,您也可以完全避免使用工厂,并通过以下方式决定在编译时使用哪个类:

providers: [
{
provide: MyOptions,
useValue: options
},
{
provide: 'CHIRP_SENSOR',
useValue: process.env.SIMULATION === 'true'
? ChirpSensorMock
: ChirpSensor
},
],

或者干脆:

providers: [
{
provide: MyOptions,
useValue: options
},
{
process.env.SIMULATION === 'true' ? ChirpSensorMock : ChirpSensor
},
],

如果您没有使用上述工厂,则可以在 ChirpSensor 中注入(inject)选项。 (或 Mocked Sensor)` 使用典型的基于构造函数的依赖注入(inject):

@Injectable()
export class ChripSensor {
constructor(@inject(MyOptions) private options: MyOptions) {
}

// ...
}

根据您的选项是包含在类中还是包含在简单对象中,您可以使用 useValueuseClass .与 useClass您必须编写更少的代码并且不必使用 @Inject装饰器,因为类本身用作 DI token 。不过,好像 MyOptions是一个类,不需要使用 @Inject无论如何都要注入(inject)依赖项,因为 NestJS 使用该类作为 DI token ,无论您是否使用 useValueuseClass提供依赖...

关于dependency-injection - NestJs:动态创建类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60617391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com