Вы можете передать опции на ваш завод через 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
(или Mocked Sensor) `с использованием типичного внедрения зависимостей на основе конструктора:
@Injectable()
export class ChripSensor {
constructor(@inject(MyOptions) private options: MyOptions) {
}
// ...
}
В зависимости от того, обернуты ли ваши параметры в классе или в простом объекте, вы можете использовать useValue
или useClass
. С useClass
вы должны писать меньше кода и не должны использовать декоратор @Inject
, поскольку сам класс используется в качестве токена DI. Однако, если MyOptions
является классом, вам не нужно использовать @Inject
в любом случае для внедрения зависимости, потому что Nest JS использует класс в качестве токена DI, независимо от того, использовали ли вы useValue
или useClass
чтобы обеспечить зависимость ...