1. ホーム
  2. angular

互いに依存しているサービス

2023-08-24 18:22:52

質問

私のAngular 2アプリでは、互いに依存する2つのサービスがあります(サービスAはサービスBからメソッドを呼び出し、逆も同様です)。

以下は関連するコードです。

app.component.ts :

import {Component} from 'angular2/core';
import {TempService} from '../services/tmp';
import {Temp2Service} from '../services/tmp2';

@Component({
    selector: 'my-app',
    templateUrl: 'app/app/app.component.html',
    providers: [TempService, Temp2Service]
})
export class AppComponent { (...) }

サービス1です。

import {Injectable} from 'angular2/core';
import {Temp2Service} from './tmp2';

@Injectable()
export class TempService {
  constructor (private _sessionService: Temp2Service) {}
}

サービス2

import {Injectable} from 'angular2/core';
import {TempService} from './tmp';

@Injectable()
export class Temp2Service {
  constructor (private _sessionService: TempService) {}
}

アプリを実行すると、以下のようなエラーが発生します。

EXCEPTION: 'Temp2Service' のすべてのパラメータを解決できません。 'Temp2Service'(undefined)のすべてのパラメータを解決できません。すべてのパラメータがInjectで装飾されているか、有効な型アノテーションを持っていることを確認してください。 Injectで装飾されているか、有効な型アノテーションを持つか、そして Temp2Service' が Injectable でデコレートされていることを確認してください.

片方のサービスのコンストラクタをコメントすると、アプリは正常に実行されます。ということは、2つのサービスの相互参照に問題があるのではないかと推測しています。

ここで何が間違っているのか見当がつきますか?それとも、私のアプローチがすでに間違っているのでしょうか?

どのように解決すればよいのでしょうか?

これは循環依存と呼ばれるものです。Angular2自体の問題ではありません。私が知る限り、どの言語でも許されることではありません。

この循環型依存関係を取り除くには、コードをリファクタリングする必要があります。おそらく、これらのサービスのうちの1つを新しいサービスに分割する必要があるでしょう。

単一責任の原則に従えば、循環的依存関係の罠にはまることはないでしょう。