Предотвращение внедрения иерархической зависимости в Angular 6 - PullRequest
0 голосов
/ 15 октября 2018

tl; dr: Как я могу запретить Angular внедрять пользовательскую реализацию HttpClient в модули более низкого уровня?Вместо этого я хочу использовать стандартную реализацию (например, без перехватчиков), которая поставляется с Angular.


Я создал библиотеку Angular 6 с Angular CLI.Эта библиотека также экспортирует модуль и сервис, которые предоставляют мне функциональность управления идентификацией (самостоятельно) и используют HttpClientModule для отправки запросов на сервер API.

В моих приложениях я ссылаюсь на эту библиотеку (через частный npm).упаковка), которая отлично работает.

Недавно я наткнулся на HttpInterceptors, чтобы расширить функциональность до уже существующего HttpClient из стартового комплекта ракеты ngx.Вы можете найти код для реализации HttpClient здесь: https://github.com/ngx-rocket/starter-kit/blob/master/src/app/core/http/http.service.ts

Когда я предоставляю свою собственную реализацию HttpClient в массиве provider моего модуля приложения, кажется, что из-за внедрения иерархической зависимости Angular моябиблиотека также будет использовать предоставленную пользовательскую реализацию, даже если я этого не хочу.

Итак, мой вопрос: Как я могу запретить Angular внедрять пользовательскую реализациюHttpClient в модулях более низкого уровня?Вместо этого я хочу использовать стандартную реализацию (например, без перехватчиков) в модулях более низкого уровня.

То, что я уже пробовал, предоставляет

{ provide: HttpClient, useValue: HttpClient }

в моей службе пользователя (пожалуйста, найдитекод ниже), который не работает.

Этот код находится внутри моего приложения:

app.module.ts

/* other module code */
imports: [
   UserModule
],
providers: [
   { provide: HttpClient, useValue: MyOwnHttpClientImplementation }
]
/* other module code */

Этот кодвнутри библиотеки:

user.module.ts

/* other module code */
imports: [
    HttpClientModule
    /* At this point, I want to use the standard HttpClient implementation */
],
providers: [
    UserService,
    { provide: HttpClient, useValue: HttpClient }
]
/* other module code */

user.service.ts

/* Here are standard HttpClient .get requests, which unfortunately
   use the interceptors that are being provided by the application that
   uses the library and the user module / service */

1 Ответ

0 голосов
/ 16 октября 2018

Я решил эту проблему, создав новый экземпляр инжектора в конструкторе моей пользовательской службы.Таким образом, будет использоваться не HttpClient из внешнего приложения, а угловая реализация:

constructor(
    private httpHandler: HttpHandler
) {
    const injector = Injector.create(
        {
            providers: [
                { provide: HttpClient, useClass: HttpClient, deps: [HttpHandler] },
                { provide: HttpHandler, useValue: httpHandler }
            ]
        }
    );

    this.httpClient = injector.get(HttpClient);
}
...