【问题标题】:Circular dependency injection angular 2循环依赖注入角2
【发布时间】:2017-03-24 09:04:03
【问题描述】:

我一直在努力将services 相互注入。以下博客Circular Dependency in constructors and Dependency Injection 有点让人困惑

两个对象中的一个隐藏了另一个对象 C

在相互注入服务类时出现以下错误

无法解析 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);
   }
}

您的 cmets 和回答将不胜感激。

谢谢

【问题讨论】:

    标签: angular dependency-injection circular-dependency


    【解决方案1】:

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

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

    【讨论】:

    • Maximum call stack size exceeded
    • 从哪里导入Injector 类?是@angular/core 吗?我似乎无法在网上找到信息
    • @KiJéy,我也找不到它,但是当我尝试 @angular/core 时它成功了。
    • 正如@Polyergic 所说,在构造函数中手动注入并不太有用。我发现在 setTimeout 完成之前调用了方法。我将手动注入移到了依赖项使用之前。此外,删除了 setTimeout。
    • 抱歉挖掘了这个话题,但总是可以避免循环引用。这正是“两个对象之一隐藏另一个对象 C”中的意思。如果您认为无法避免,那只是意味着其中一个应该分为两个不同的。至少在 angularJs 中(从未在 angular2 中尝试过),还可以将函数“添加”到您注入的服务中,因此许多需要循环的情况都可以这样解决。
    【解决方案2】:

    在我的情况下(Ionic 项目中的 Angular 4),即使在服务使用之前(在用户交互时)注入服务也不起作用(启动时相同的“无法解析所有参数...”)。

    对我有用的是按名称注入(并因此提供)服务

    所以在我的应用模块中:

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

    并且在需​​要时:

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

    【讨论】:

      【解决方案3】:

      我知道帖子很旧,但无论如何感谢上述解决方案对我有用,因为我有循环依赖问题,所以我必须使用注入器来避免创建中介服务进行通信,尽管上述解决方案中有一个更正

      从 Angular 5 开始,我们需要使用:

      提供者:[{provide: "MyServiceName",useclass: MyServiceClass}],

      然后

      injector.get('MyServiceName')

      虽然 get 被破坏了

      【讨论】:

      • 你应该更具体,哪个文件与哪个导入,这对我有帮助@least
      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多