2017-07-04 22 views
2

私は角度依存性注入について簡単に質問します。私は、サービスがアプリケーション全体で単一のインスタンスしか持たないようにするために、サービスを使用するコンポーネントではなくAppModuleのプロバイダとしてプロバイダに含める必要があることを読んでいます。これにより、AppModuleによってインポートされた他のモジュールが適用されますか。たとえば、AuthServiceをSharedModuleのプロバイダとして使用したいとします。このモジュールをAppModuleにインポートすると、アプリケーションのすべてのコンポーネントが同じサービスインスタンスを共有できますか?角度依存性注入

+0

タイトルに質問を記入してください。 –

+0

私は本当に方法を知らなかった。 – user455289

+0

はい、ルートインジェクタに遅延ロードされたプロバイダを除いたすべてのモジュール –

答えて

1

短い答え:はい

けど...

は、共有モジュールでアプリ全体のシングルトンプロバイダを指定しないでください。その共有モジュールをインポートする遅延ロードモジュールは、サービスの独自のコピーを作成します。

出典:https://angular.io/guide/ngmodule#why-userservice-isnt-shared

+0

SharedModuleが複数回インポートされる可能性があるため、AuthModuleのインスタンスが複数存在することがあります。 CoreModuleの場合と同じように、一度だけインポートされます。右? – user455289

+0

@ user455289 yes exacltyですが、これらのモジュールが遅延ロードされている場合のみです。もしそうでなければ、それは動作しますが、推奨されません。角度のある文書では推奨されないものがある場合は、将来のリリースで変更する可能性があるため、考慮する必要があります。 – echonax

+0

ああ、ありがとう。 – user455289

0

いいえ、あなたはシングルトンパターンを強制するNgModuleインポート/エクスポートを使用することはできません。 echonaxの答えで指摘されているように、遅延ロードモジュールはすべてのサービスを再びブートストラップします。

これで、コンストラクタを使用して、モジュールの重複インポートをブロックすることができます。これにより、開発者はモジュールのロード順序を管理し、遅延モジュールがモジュールを直接インポートすることを防ぐことができます。モジュールがセカンダリモジュールによってインポートされた場合、この問題を回避することができます。

あなたのNgModuleクラスのコンストラクタ

@NgModule({ 
    providers: [ 
     MySingletonService 
    ] 
}) 
export class ExampleModule { 
    public constructor(@Optional() @SkipSelf() parentModule: ExampleModule) { 
     if (parentModule) { 
      throw new Error('ExampleModule is already loaded'); 
     } 
    } 
} 

それはそれで一つだけのサービスを持っているモジュールを作成するのが最善ですで、このようにブロックし、他の何かのためにそれらを使用することはできません。これにより、依存関係の種類をもっと簡単に管理できます。