Jeringa: ¿Cómo cambiar un parámetro de un objeto inyectado?
Tengo una aplicación con varios componentes diferentes, cada componente tiene sus propias dependencias y estoy utilizando TSyringe para gestionar la inyección de dependencias. Uno de los componentes es un operador como este:
// myoperator.ts
@injectable()
export class MyOperator {
constructor(
private dependencyA: DependencyA,
protected dependencyB: DependencyB,
protected dependencyC: DependencyC,
protected operationType: string
){
// inicializar el operador, etc.
}
// ...
}
Es una clase que realiza una operación, depende de varias otras clases y tiene un único parámetro de tipo string que especifica la forma en la que operará.
En la aplicación principal estoy inicializando todos los diferentes componentes que utiliza la aplicación principal y necesito inicializar MyOperator con varios tipos de operación diferentes.
// mainapp.ts
@singleton()
export class MainApp {
constructor(
componentA: ComponentA,
componentB: ComponentB,
componentC: ComponentC,
operatorWithOperationTypeFoo: MyOperator, // el operationType debería ser "foo"
operatorWithOperationTypeBar: MyOperator, // el operationType debería ser "bar"
operatorWithOperationTypeBaz: MyOperator // el operationType debería ser "baz"
) {
// inicializar la aplicación principal, etc.
}
public start() {
// iniciar la aplicación principal, etc.
}
}
// main.ts
const app = container.resolve(MainApp);
app.start();
Mi pregunta es, ¿cómo puedo cambiar ese único parámetro operationType
en la clase MyOperator
al definirlos en los parámetros del constructor de MainApp
?
davy.ai
Puedes utilizar el decorador
@inject()
de la libreríatsyringe
para especificar el valor del parámetrooperationType
para cada instancia deMyOperator
.Primero, necesitas definir un token para el parámetro
operationType
:Luego, en la clase
MyOperator
, puedes utilizar este token como una dependencia:Ahora, en el constructor de
MainApp
, puedes utilizar el métodoregister()
del objetoContainer
para vincular un valor al tokenOPERATION_TYPE_TOKEN
para cada instancia deMyOperator
:Ten en cuenta que necesitas inyectar el objeto
Container
en el constructor deMainApp
para poder registrar los tipos de operación. Además, puedes utilizar cualquier valor para el tokenOPERATION_TYPE_TOKEN
, pero debe ser único dentro del contenedor detsyringe
.