Angular передать сервис с зависимостями в модуль с помощью forRoot - PullRequest
1 голос
/ 16 июня 2020

У меня есть сервис для аутентификации на основе JWT. Чтобы повторно использовать эту службу во всех своих проектах, я создал библиотеку, которая должна поставляться с npm.

Для работы этой службы мне нужны API-вызовы. В каждом проекте API может выглядеть совершенно по-разному, поэтому я не хочу предоставлять эту функциональность внутри своей библиотеки, вместо этого внедряю другую службу, которая обрабатывает мои API-вызовы.

Моя идея заключалась в создании модуля, содержащего мою службу и предоставить интерфейс для описания службы API-вызовов и внедрить его для Root. Проблема в том, что моя служба api имеет некоторые зависимости, такие как HttpClient, и я не могу просто создать ее экземпляр в моем app.module.

Моя библиотека выглядит так:

auth.module .ts

import { NgModule, ModuleWithProviders, InjectionToken } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { AuthAPI } from '../models/authAPI';
import { AuthapiConfigService } from '../services/authapi-config.service';


@NgModule()
export class AuthModule {

  static forRoot(apiService: AuthAPI): ModuleWithProviders {
    return {
      ngModule: AuthModule,
      providers: [
        AuthService,
        {
          provide: AuthapiConfigService,
          useValue: apiService
        }
      ]
    };
  }
}

auth-api.interface.ts

import { Observable } from 'rxjs';

export interface AuthAPI {
  reqLogin(): Observable<{ access_token: string; }>;
  reqRegister(): Observable<{ access_token: string; }>;
}

auth-api-config.service.ts

import { InjectionToken } from '@angular/core';
import { AuthAPI } from '../models/authAPI';
/**
 * This is not a real service, but it looks like it from the outside.
 * It's just an InjectionTToken used to import the config object, provided from the outside
 */
export const AuthapiConfigService = new InjectionToken<AuthAPI>('API-Service');

auth.service.ts

 constructor(@Inject(AuthapiConfigService) private apiService) {}

Как я пытаюсь это реализовать:

auth-rest-service.ts

import { Injectable } from '@angular/core';
import { AuthAPI } from 'projects/library-project/src/lib/auth/models/authAPI';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class AuthRestService implements AuthAPI  {

  constructor(private http: HttpClient) {}

  reqLogin(): Observable<{ access_token: string; }> {
    return this.http.post<{access_token: string}>(`/login`, 'test');
  }

  reqRegister(): Observable<{ access_token: string; }> {
    return this.http.post<{access_token: string}>(`/login`, 'test');
  }

}

приложение .module.ts

import { AuthRestService } from './components/auth-service/auth-rest.service';


@NgModule({
  declarations: [
   ...
  ],
  imports: [
    ...
    AuthModule.forRoot(AuthRestService),
    ...
  ],
  providers: [AuthModule],
  bootstrap: [AppComponent]
})
export class AppModule { }

Я не могу создать экземпляр AuthRestService из-за зависимостей, которые эта служба имеет (HttpClient). Есть ли способ сообщить angular о предоставлении мне этой услуги.

...