圆形依赖注入角度2

Cle*_*ode 13 dependency-injection circular-dependency angular

我一直在努力services互相注入.构造函数和依赖注入中的以下博客循环依赖关系在它所说的地方有点令人困惑

两个对象之一是隐藏另一个对象C.

我在将Service类注入彼此时遇到以下错误

无法解析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);
   }
}
Run Code Online (Sandbox Code Playgroud)

您的意见和回答将受到很多赞赏.

谢谢

Gün*_*uer 28

您可以通过注入Injector而不是导致循环依赖关系的其中一个服务来解决循环依赖关系

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

  • 正如@Polyergic所说,在构造函数中手动注入并不太有用.我发现在setTimeout完成之前调用了方法.我将手动注入移动到依赖项的使用之前.另外,删除了setTimeout. (4认同)
  • 我从哪里导入`Injector`类?是@ @ angular/core`吗?我似乎无法在网上找到这些信息 (2认同)
  • 抱歉挖掘主题,但总是可以避免循环引用.这正是"两个对象中的一个隐藏另一个对象C"的含义.如果你认为无法避免,那就意味着其中一个应该分为两个不同的.至少在angularJs中(从未在angular2中尝试过),也可以将"添加"函数添加到您注入的服务中,因此许多需要循环的情况都可以像这样解决. (2认同)