【发布时间】:2020-06-22 08:05:02
【问题描述】:
我想在 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);
}
}
};
不太确定如何在此处继续/正确注入工厂,因为示例在没有选项的构造函数中创建对象?
问题:
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})});
}
【问题讨论】:
标签: dependency-injection factory nestjs