angular dependency-injection circular-dependency

Inyección de dependencia circular angular 2



dependency-injection circular-dependency (3)

He estado luchando por inyectar services entre sí. El siguiente blog Circular Dependency in constructors and Dependency Injection es un poco confuso donde dice

Uno de los dos objetos está ocultando otro objeto C

Me sale el siguiente error al inyectar la clase de servicio entre sí

No se pueden resolver todos los parámetros de 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); } }

Sus comentarios y respuestas serán apreciados mucho.

Gracias


En mi caso (Angular 4 en un proyecto Ionic) incluso inyectar el servicio justo antes de que su uso (tras la interacción del usuario) no funcionara (el mismo "No se pueden resolver todos los parámetros ..." al inicio).

Lo que funcionó para mí fue inyectar (y así proporcionar) el servicio por su nombre .

Entonces, en mi módulo de aplicación:

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

Y cuando sea necesario:

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


Puede solucionar las dependencias circulares inyectando Injector lugar de uno de los servicios que causan la dependencia circular

private payrollService:PayrollService; constructor(/*private payrollService:PayrollService*/ injector:Injector) { setTimeout(() => this.payrollService = injector.get(PayrollService)); }


Sé que la publicación es antigua, pero de todos modos, la solución anterior me ha funcionado, ya que tuve un problema de dependencia cíclica, así que tengo que usar el inyector para evitar crear un servicio de mediador para comunicarme, aunque una corrección en la solución anterior

Desde Angular 5 en adelante necesitamos usar:

proveedores: [{proporcionar: "MyServiceName", useclass: MyServiceClass}],

y entonces

injector.get (''MyServiceName'')

aunque get se derpeca