0

我有以下课程(仅相关部分):

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 方法来使这个通用化,比如providersAppModule.

任何想法?

4

0 回答 0