web-dev-qa-db-fra.com

Constructeur DI avec paramètres optionnels

Mon constructeur a des paramètres facultatifs et ils semblent jouer avec la façon prédominante de faire DI.

constructor(public name:string, public age?:number, private _service:Service);

TypeScript n'aime naturellement pas que je mette un paramètre non optionnel derrière un paramètre facultatif, en outre le service n'est pas injecté lorsque le paramètre facultatif n'est pas défini. Comment résoudre ça? Je ne peux pas le mettre ailleurs dans le constructeur car je serais censé définir le service manuellement.

Y a-t-il quelque chose comme l'injection sur le terrain?

@Inject() private _service:Service;

constructor(public name:string, public age?:number);

Dois-je remplacer les paramètres facultatifs par des valeurs par défaut? D'autres suggestions?

EDIT: Comme discuté ci-dessous, j'ai essayé d'injecter un service dans un objet qui n'est pas créé par DI angulaire. Ça ne marche pas. Comme je ne peux pas créer cette classe (modèle) à l'aide de DI, je passe maintenant le service manuellement à partir de la classe qui instancie ces objets.

15
KenavR

Ajoutez simplement le décorateur @Optional() avant le paramètre constructeur qui ne doit être injecté que si un fournisseur est enregistré.

constructor(public name:string, @Optional() public age:number)
21

Si je comprends bien ce que vous essayez de faire, vous avez besoin d'une usine de service. Voir ici: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

Fondamentalement,

class MyClass {
    constructor(public name:string, private _service:Service, public age?:number){}
}

Puis

let myFactory = (_service: Service) => {
  return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service);
};

Et puis vous devez fournir votre service comme ceci:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]
3
Cosmin Popescu