У меня есть сервис для аутентификации на основе 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 о предоставлении мне этой услуги.