web-dev-qa-db-fra.com

Dépendance circulaire injection angulaire 2

J'ai eu du mal à m'injecter services l'un dans l'autre. Le blog suivant Circular Dependency in constructors and Dependency Injection est un peu déroutant là où il est dit 

Un des deux objets cache un autre objet C

J'ai l'erreur suivante lors de l'injection de la classe de service dans l'autre

Impossible de résoudre tous les paramètres pour PayrollService: (SiteService, StorageService, SweetAlertService,?)

//abstractmodal.service.ts
@Injectable()
 export abstract class AbstractModel {

   abstract collection = [];

   constructor(private siteService: SiteService, private storageService: StorageService,
                private sweetalertService: SweetAlertService) {}


   setCollectionEmpty() {
      this.collection = [];
    }
}
//account-payable.service.ts
@Injectable()
export class AccountPayableService extends AbstractModel {

   public collection = [];

   constructor(private sS: SiteService,private stS: StorageService, private sws: SweetAlertService,
            private accpPoService: PayablePurchaseOrderService, private attachmentService: AttachmentService,
            private injectorService: InjectorService) { 
         super(sS, stS, sws);
     }
}
//injector.service.ts
@Injectable()
export class InjectorService {
   constructor(private payrollService: PayrollService) {}

   cleanPayrollCollection() {
     this.payrollService.setCollectionEmpty();
   }
}
//payroll.service.ts
@Injectable()
export class PayrollService extends AbstractModel {

   public collection = [];

   constructor(private sS: SiteService,private stS: StorageService, private sws: SweetAlertService,
            private accpService: AccountPayableService) { 
    super(sS, stS, sws);
   }
}

Vos commentaires et réponses seront très appréciés.

Merci

10
Basheer Ahmed

Vous pouvez contourner les dépendances circulaires en injectant Injector à la place d'un des services à l'origine de la dépendance circulaire

private payrollService:PayrollService;
constructor(/*private payrollService:PayrollService*/ injector:Injector) {
  setTimeout(() => this.payrollService = injector.get(PayrollService));
}
25
Günter Zöchbauer

Dans mon cas (Angular 4 dans un projet Ionic), même l'injection du service juste avant son utilisation (lors de l'interaction de l'utilisateur) ne fonctionnait pas (idem "Impossible de résoudre tous les paramètres ..." au démarrage).

Ce qui a fonctionné pour moi a été de injecter (et donc fournir) le service par son nom}.

Donc, dans mon module d'application:

...
providers: [{provide: "MyServiceName", MyServiceClass}],
...

Et en cas de besoin:

const myService: MyServiceClass = injector.get("MyServiceName");
...
0
Jul

Je sais que le message est ancien, mais merci quand même la solution ci-dessus a fonctionné pour moi car j’avais un problème de dépendance cyclique, je dois donc utiliser injector pour éviter de créer un service de médiation pour communiquer, bien qu’une correction de la solution ci-dessus

À partir de Angular 5, nous devons utiliser:

fournisseurs: [{fournir: "MyServiceName", useclass: MyServiceClass}],

et alors

injector.get ('MyServiceName')

bien que se soit dérépécé

0
Nikhil Kamani