プロバイダーを使用する必要があります: []
依存性注入でインスタンスを作成できるようにするには、これらのクラス (または他の値) のプロバイダーをどこかに登録する必要があります。
プロバイダーを登録する場所によって、作成される値の範囲が決まります。Angulars DI は階層的です。
ツリーのルートにプロバイダーを登録する場合
>=RC.5
@NgModule({
providers: [/*providers*/]
...
})
または遅延ロードされたモジュールの場合
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserServiceConfig, useValue: config }
]
};
}
<=RC.4
(bootstrap(AppComponent, [Providers})
または@Component(selector: 'app-component', providers: [Providers])
(ルート コンポーネント)
インスタンスを要求するすべてのコンポーネントとサービスが同じインスタンスを取得します。
プロバイダーが子コンポーネントの 1 つに登録されている場合、このコンポーネントの子孫に対して新しい (別の) インスタンスが提供されます。
コンポーネントが (コンストラクターのパラメーターによって) インスタンスを要求する場合、DI はコンポーネント ツリーを (リーフからルートに向かって) 「上向き」に検索し、最初に見つかったプロバイダーを取得します。このプロバイダーのインスタンスが以前に作成されている場合は、このインスタンスが使用されます。それ以外の場合は、新しいインスタンスが作成されます。
@注入()
コンポーネントまたはサービスが DI からの値を要求する場合
constructor(someField:SomeType) {}
DI はタイプでプロバイダを検索しますSomeType
。@Inject(SomeType)
が追加された場合
constructor(@Inject(SomeType) someField:SomeType) {}
DI は、 に渡されたパラメータによってプロバイダを検索します@Inject()
。上記の例では、渡されたパラメーターは@Inject()
パラメーターの型と同じであるため、@Inject(SomeType)
冗長です。
ただし、構成設定を挿入するなど、動作をカスタマイズしたい場合があります。
constructor(@Inject('someName') someField:string) {}
string
複数の構成設定が登録されている場合、タイプだけでは特定の構成設定を区別するのに十分ではありません。
構成値は、プロバイダーとして次のように登録する必要があります
>=RC.5
@NgModule({
providers: [{provide: 'someName', useValue: 'abcdefg'})]
...
})
export class AppModule {}
<=RC.4
bootstrap(AppComponent, [provide('someName', {useValue: 'abcdefg'})])
@Inject()
したがって、コンストラクターが次のようにFormBuilder
見える場合は必要ありません
constructor(formBuilder: FormBuilder) {}