我有以下课程(仅相关部分):
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();
}
}
这很好用,但我想知道如何使它更通用。事实上,假设我想用这个类创建一个单独的 npm 包,我不能告诉用户创建setAppInjector
函数并将其注册到AppModule
(而且我什至不能从我的 npm 包中使用它......)。
所以我正在寻找一种 Angular 方法来使这个通用化,比如providers
在AppModule
.
任何想法?