プロバイダーは、DI がインスタンスを作成したり、コンストラクターに渡す必要がある値や を使用して要求された値を取得したりするための戦略ですinjector.get(..)。
providers: [
MyService // short form for
{ provide: MyService, useClass: MyService },
// create instance of `MyServiceMock` when `MyService` is requested
{ provide: MyService, useClass: MyServiceMock },
// redirect to a provider for `MyService` (^^^ use this one on the previous line)
{ provide: MyServiceMock, useExisting: MyService },
// custom code to create an instance
{ provide: MyService, useFactory: (a, b) => new MyMockService(a, b), deps: [Http, new Inject('foo')]},
{ provide: 'foo', useValue: 'bar' }
]
(に渡される値provide: ...は、プロバイダーを検索するためのトークンです。他のパラメーターは、インスタンスを作成するために使用する戦略です)
DI がクラスのインスタンスを作成するとき、インスタンスを作成する必要があるクラスのコンストラクター パラメーターまたはdepsプロバイダーのパラメーターを読み取り、そのインスタンスを作成するためにそのコンストラクターに渡す必要がある値を把握します。
次に、これらの必要なパラメーター値に一致するプロバイダーを検索します (コンストラクター パラメーターの型、または@Inject(...)デコレーターを使用してコンストラクター パラメーターに割り当てられたトークンによって)。
@Injectable()
class MyService {}
@Component(...)
class MyComponent {
constructor(private myService:MyService) {}
}
Angular がMyComponentインスタンスを必要とする場合、DI から要求します。DI がインスタンスを作成するには、インスタンスをMyServiceコンストラクターに渡すことができるようにする必要があります。DI はプロバイダーを検索してMyServiceインスタンスを作成します。以前にインスタンスが作成されている場合は、このインスタンスが再利用されます。
プロバイダーが登録されている場所は、コンストラクターに渡されるインスタンスまたは値を定義します。
この例では、コンポーネント プロバイダーのインスタンスが注入されます。
コンポーネントにproviders: [MyService]行がない場合は、プロバイダーからのインスタンス@NgModule()が注入されます。
@NgModule({
...
providers: [MyService],
})
@Component({
providers: [MyService],
})
class MyComponent {
constructor(private myService:MyService) {}
}
各子コンポーネントには、親コンポーネント インジェクターの子インジェクターである独自のインジェクターがあります。コンポーネントが作成されると、DI はコンポーネント インジェクターでプロバイダーを検索し、次に親コンポーネント インジェクターで ..., up too を検索し、次にインジェクターでプロバイダーを検索しAppComponentます@MgModule()。必要なトークンのプロバイダーを持つ最初のインジェクターは、インスタンスを取得するために使用されます。これは、プロバイダーを提供する場所が重要であることを意味します。プロバイダーをコンポーネントに追加すると、提供されたサービスのインスタンスが、コンポーネント インスタンスと同じ数だけ取得されます。プロバイダーのみを追加する@NgModule(...) class AppModule{}と、アプリケーション全体でインスタンスが 1 つだけになります。
遅延ロードされたモジュールは、さらに複雑になります。詳細については、ドキュメントを確認してください。