最新リリースのAngular 6では、サービスはサービスメタデータのprovidedIn
プロパティを使用してモジュールに登録されています。
@Injectable({
providedIn: 'root',
})
export class HeroService {}
ただし、ドキュメントでは、Angular 5で行ったのと同じように、モジュールメタデータ内のモジュールproviders
配列にサービスを登録することも参照しています。
@NgModule({
providers: [HeroService],
})
export class AppModule {}
そう、
providers
配列メソッドは廃止予定ですか?基本的にはどちらでも使用できますが、新しいCLIではprovideIn
の作成中にservice
が自動的に追加されます。
新しいprovidedIn属性を使用して、
@Injectable()
デコレータのすぐ内側にプロバイダを登録するための新しい推奨方法があります。値またはアプリケーションの任意のモジュールとして'root'
を受け入れます。'root'
を使用するとき、あなたの注射可能物はアプリケーションのシングルトンとして登録されるでしょう、そしてあなたはそれをルートモジュールのプロバイダーに追加する必要はありません。同様に、providedIn: UsersModule
を使用すると、注入可能オブジェクトは、モジュールのプロバイダーに追加せずにUsersModule
のプロバイダーとして登録されます。この新しい方法は、アプリケーションのツリーシェイクを改善するために導入されました。現在、モジュールのプロバイダに追加されたサービスは、たとえそれがアプリケーションで使用されていなくても、最終的なバンドルになるでしょう。これは少し悲しいことです。
詳しくはこちらをご覧ください
いつものように複数の解決策が利用可能であるときそれはあなたが達成したいことによります。しかし ドキュメンテーション はあなたが選ぶべきいくつかの指示を与えます。
アプリケーションルートインジェクタで常にサービスを提供するのが望ましくない場合があります。おそらく、ユーザーはサービスの使用を明示的にオプトインするか、またはサービスを遅延負荷のコンテキストで提供する必要があります。この場合、プロバイダは特定の
@NgModule class
に関連付けられている必要があり、そのモジュールを含むインジェクタによって使用されます。
そのため、基本的に、アプリケーション全体のサービスにはprovidedIn: 'root'
を使用します。他のサービスについては古いバージョンを使い続けてください。
あなたにはすでに違った方法でサービスを提供するという選択肢があることを忘れないでください。例えば、Injectableをコンポーネントレベルで宣言することも可能です(これはV6では変わりません)。
@Component({
selector: 'app-my-component',
templateUrl: './my.component.html',
providers: [ MyService ]
})
このようにして、サービスはMyComponent
とそのサブコンポーネントツリーでのみ利用可能になります。
Angular 5+開発者を使用している場合は、providedIn: 'root'として宣言されると自動的に注入可能サービスが作成されます。この場合、app.module.tsにサービスをインポートする必要はありません。他のコンポーネントで直接使うことができます。
@NgModule()
および@Component()
デコレータには、providerメタデータオプションがあります。ここで、NgModuleレベルまたはコンポーネントレベルのインジェクタ用にプロバイダを設定できます。
@Injectable()デコレータにはprovidedInメタデータオプションがあります。このオプションでは、ルートインジェクタまたは特定のNgModuleのインジェクタを使用して、装飾サービスクラスのプロバイダを指定できます。
あなたの場合、それは "root"レベルで提供されているので、これをモジュールのプロバイダとして再度追加する必要はありません。
依存性注入についての詳細 はこちら