У меня есть следующий класс (только соответствующая часть):
import { AppInjector } from '@app/shared/utility/app-injector';
import { HttpService } from '@app/shared/services/http.service';
export class Lazy<T> {
private readonly _http: HttpService = AppInjector.get(HttpService);
private _init() {
// Usage of this._http
}
}
Так что в основном это простой тип, но для него нужно использовать Angular HttpService
. Для этого я создал файл со следующим кодом:
import { Injector } from '@angular/core';
export let AppInjector: Injector;
export function setAppInjector(injector: Injector) {
if (AppInjector) {
console.error('Programming error: AppInjector was already set');
}
else {
AppInjector = injector;
}
}
И я устанавливаю его в конструкторе моего AppModule
:
export class AppModule {
constructor(injector: Injector) {
setAppInjector(injector);
}
}
Наконец, я использую например, в сервисе:
@Injectable({
providedIn: 'root',
})
export class FooService {
private readonly ROUTE: string = "/api/foo";
private _campaigns: Lazy<ICampaign[]> = new Lazy<ICampaign[]>(`${this.ROUTE}/campaigns`);
public get campaigns(): Lazy<ICampaign[]> {
return this._campaigns;
}
}
А в компоненте я могу сделать что-то вроде:
export class FooComponent implements OnInit {
constructor(private _fooService: FooService) {}
public async ngOnInit(): Promise<void> {
await this._fooService.campaigns.load();
}
}
Это работает довольно хорошо, но мне интересно, как я мог бы сделать это более общий c. Действительно, скажем, я хотел создать отдельный пакет npm только с этим классом, я не могу сказать пользователям создать функцию setAppInjector
и зарегистрировать ее в AppModule
(и я даже не мог использовать ее из своего Пакет npm в любом случае ...).
Так что я ищу Angular способ сделать этот шаблон c, что-то вроде передачи чего-либо в свойство providers
декоратора AppModule
.
Есть идеи?