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