web-dev-qa-db-ja.com

循環依存注入angular 2

私はお互いにservicesを注入することに苦労してきました。次のブログ コンストラクターの依存関係と依存性注入 は、それが言っているところを混乱させるようなものです

2つのオブジェクトの1つが別のオブジェクト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);
   }
}

あなたのコメントと答えはたくさんありがたいです。

ありがとう

13
Clean code

循環依存を引き起こすサービスの1つではなくInjectorを注入することにより、循環依存を回避できます。

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

私の場合(IonicプロジェクトのAngular 4)は、使用前に(ユーザーインタラクション時に)サービスを注入しても機能しませんでした(同じ「すべてのパラメータを解決できない...」起動)。

私のために働いたのはサービスを名前で注入する(そして提供する)でした。

だから私のアプリモジュールで:

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

そして必要なとき:

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

私は投稿が古いことを知っていますが、循環依存の問題があったため、上記の解決策がうまくいったので、メディエータサービスを作成して通信を回避するためにインジェクタを使用する必要があります。

Angular 5以降から使用する必要があります:

プロバイダー:[{provide: "MyServiceName"、seclass: MyServiceClass}]、

その後

injector.get( 'MyServiceName')

getはderpecatedされていますが

0
Nikhil Kamani