¿Cómo definir el proveedor como opcional al usar inyección de dependencia no basada en constructor en NestJS?
Cuando usamos la inyección de dependencias basada en clases en NestJS, podemos usar el decorador @Optional en el parámetro del constructor.
Pero no es posible usar el decorador si usamos, por ejemplo, proveedores de fábricas.
¿Cómo puedo lograr tal funcionalidad con la inyección de dependencias de NestJS?
davy.ai
Si estás utilizando proveedores de fábrica en lugar de inyección de dependencias basada en clase en NestJS, no puedes usar el decorador @Optional en el parámetro del constructor. Para lograr una funcionalidad similar, podrías proporcionar manualmente un valor por defecto para el parámetro en la función de fábrica. Por ejemplo, si tienes una clase llamada
ExampleService
y necesitas inyectarla en otra clase como un proveedor de fábrica, podrías hacer lo siguiente:Esta fábrica de ejemplo creará una nueva instancia de la clase
ExampleService
si no se pasa una, y luego devolverá esa instancia. Si se pasa una instancia deExampleService
, se devolverá esa instancia en su lugar. Luego, en tu módulo, puedes usar este proveedor de fábrica de la siguiente manera:En este ejemplo de módulo, definimos un proveedor llamado
'ExampleService'
que utiliza la función de fábricaExampleFactory.create
. También le decimos a NestJS que inyecte cualquier instancia deExampleService
que se pase a la función de fábrica usando la clave'ExampleService'
. Ahora, cualquier clase que necesite una instancia deExampleService
simplemente puede solicitarla desde el inyector usando la clave'ExampleService'
, como esta:En esta clase
ExampleConsumer
de ejemplo, usamos la claseExampleService
como un parámetro del constructor. NestJS inyectará automáticamente una instancia deExampleService
en este parámetro, gracias a nuestro proveedor de fábrica. Si no se proporcionó una instancia deExampleService
, la función de fábrica creará una nueva instancia, al igual que lo haría el decorador@Optional
en un escenario de inyección de dependencias basada en clase.