循环依赖注入 Angular 2

15

我一直在努力解决将服务注入到彼此中的问题。以下博客“构造函数和依赖注入中的循环依赖关系”有些令人困惑,其中说到:

两个对象之一隐藏了另一个对象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);
   }
}

非常感谢您的评论和回答。

谢谢

3个回答

32

你可以通过注入Injector而不是导致循环依赖的某个服务来解决循环依赖问题。

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

1
Maximum call stack size exceeded - Basheer Kharoti
2
我应该从哪里导入Injector类?是从@angular/core吗?我在网上找不到相关信息。 - Mouradif
1
@KiJéy,我也找不到它,但当我尝试使用@angular/core时,它起作用了。 - ShadSterling
4
正如@Polyergic所说,手动在构造函数中注入并不是太有用。我发现方法在setTimeout完成之前就被调用了。我将手动注入移到了依赖项使用之前,并删除了setTimeout。 - Richard Matsen
2
抱歉打搅这个话题,但是循环引用总是可以避免的。这正是“两个对象中的一个隐藏了另一个对象C”所指的。如果您认为它无法避免,那只意味着其中之一应该被分成两个不同的对象。在至少angularJs中(从未尝试过angular2),还可以“添加”函数到您注入的服务中,因此许多需要循环引用的情况都可以像这样解决。 - Kaddath
显示剩余9条评论

1
在我的情况下(Ionic项目中的Angular 4),即使在用户交互时仅注入服务也无法工作(启动时出现相同的“无法解析所有参数...”)。
对我有效的方法是通过名称注入(并因此提供)服务。
所以在我的应用程序模块中:
...
providers: [{provide: "MyServiceName", MyServiceClass}],
...

并且在需要时:

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

0

我知道这篇文章已经有点老了,但还是谢谢你,上面的解决方案对我很有用,因为我有循环依赖问题,所以我必须使用注入器来避免创建中介服务进行通信,不过上面的解决方案需要作出一个更正。

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

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

然后就可以了。

injector.get('MyServiceName')

尽管get已被弃用


你应该更具体,指明是哪个文件和哪些引用,这样对我会更有帮助 @least。 - Pipo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接