Инъекция зависимостей и httpclient - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь понять DI в Angular 7. DI используется для создания экземпляра объекта для класса, который сделан как инъецируемый.

Нужно знать, как мы применяем это для HttpClient.

Я знаю, что мы можем ввести его, как показано ниже

constructor(private http: HttpClient) { }

Но откуда мы знаем, что HttpClient вводится?

Вопрос выглядит глупо.Поскольку я новичок в Angular, я пытаюсь понять логику.

1 Ответ

0 голосов
/ 30 января 2019

В основном, потому что, когда 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

...