В основном, потому что, когда HttpClientModule
импортируется, он сообщает инжектору угловой зависимости, что он может предоставить HttpClient
при необходимости.
Это делается с помощью
1) Наличие класса HttpClient
, оформленного как @Injectable()
2) Наличие модуля HttpClientModule
, который импортирует и, что более важно, обеспечивает HttpClient
.
3) Конечно, все делается с помощью инжектора угловой зависимости, который является фундаментальным элементом структуры.Он выполняет работу по просмотру различных модулей и их параметра конфигурации providers
.(и некоторые другие связанные, для Angular 6 +)
Вы должны сделать то же самое (1 и 2), если вы хотите создать свои собственные инъекционные сервисы.
Документация и соответствующие фрагменты исходного кода Angular ниже:
https://angular.io/api/common/http/HttpClientModule
HttpClientModule
Конфигурирует инжектор зависимостей для HttpClient со службами поддержки для XSRF.Автоматически импортируется HttpClientModule.
исходный код для HttpClient :
(около строки 56)
/**
* Perform HTTP requests.
*
* ....
*/
@Injectable() // <- this marks the class as Injectable (which basically makes it a Service in Angular framework)
export class HttpClient {
// ...
Исходный код для HttpClientModule
(вокруг строки ~ 143)
@NgModule({
/**
(...)
* Configures the [dependency injector](guide/glossary#injector) where it is imported
* with supporting services for HTTP communications.
*/
providers: [
HttpClient, // <- here this is how the injector system is aware of HttpClient being injectable, if you import this module
(...)
]
})
export class HttpClientModule {
}
(мои собственные комментарии в приведенных выше фрагментах отмечены // <-
).
Также стоит прочитать:
https://angular.io/guide/glossary#injector
https://angular.io/guide/dependency-injection
Один хороший интересный блог о деталях и современном(Angular 6+) способ выполнения инъекций (с возможностью встряхивания деревьев):
https://medium.com/@tomastrajan/total-guide-to-angular-6-dependency-injection-providedin-vs-providers-85b7a347b59f
Другой, более подробно описанный в механике системы внедрения зависимостей (из Angular 2):https://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html#dependency-injection-in-angular
И последний, более глубокий технический: https://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d