Как получить доступ к DI из модели в общем c способ? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующий класс (только соответствующая часть):

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.

Есть идеи?

...