Пользовательский провайдер Angular зависит от другого провайдера - PullRequest
0 голосов
/ 03 марта 2019

У меня есть служба, которая реализует интерфейс IDatabase и сохраняет данные с помощью Firebase (например).Я хотел, чтобы он был заменен другим сервисом, который будет реализовывать интерфейс IDatabase (например, couchDb).И несколько служб репозитория (зависит от типа данных) будут использовать эту корневую службу БД.

Поэтому я решил использовать нестандартные угловые провайдеры:

Здесь я создал APP_DB Injection Token, относящийся к интерфейсу IDatabase.

export const APP_DATA_DB = new InjectionToken<IDatabase>('app-data-delta-db');

Затем я использовал этот токен для объявления службы корневой БД, которая будет доступна во всех подмодулях приложения.

 // app.module.ts:

    @NgModule({
       providers: [{ provide: APP_DB, useClass: AppDataFirebaseService }]

И водин из подмодулей (users-repository.module) Я использовал также собственный провайдер для модуля репозитория, используя опцию useFactory:

//users-repository.module.ts:

    @NgModule({
        providers: [
        {    provide: USERS_REPOSITORY_SERVICE,
             useFactory: (appDb: IDatabase, store: Store<any>) => {
                 return new VehicleRepositoryService(appDb, store),
             deps: [APP_DB, Store]
        }]

Но когда я смотрю на импорт в верхней части users-repository.module.tsЯ вижу, что я импортирую APP_DB из его файла, где находится сервис Firbase.

И вопрос , как я поменяю службу корневой БД на CouchDb службу на useClass в app.module.ts, когда токен впрыска во всех подмодулях указывает на APP_DB из Firestore службы?

1 Ответ

0 голосов
/ 03 марта 2019

Я думаю, что APP_DB должен быть повторно предоставлен в users-repository.module.ts или глубже, на уровне компонента, который его использует.Таким образом, вы сможете использовать более конкретную реализацию этого сервиса (возможно, вы немного измените свою архитектуру).Пожалуйста, обратите внимание на следующую статью: Инъекторы иерархической зависимости .

...