Вставить массив классов

У меня есть класс MetaManager:

@Injectable()
export class MetaManager{

    constructor(private handlers:Handler[]){
        console.log(handlers);
    }
}

этот класс нуждается в Handler[] зарегистрироваться в качестве обработчиков. Затем, когда я получаю некоторые метаданные, я зацикливаюсь в своем массиве обработчиков, чтобы увидеть, какой из них может обработать мою мета-запись.

Сказав это, проблема в том, что я не могу предоставить массив классов как config в main.ts, вот что я попробовал (и что не сработало):

Использование записи String (с @Provide('HANDLERS') аннотация в MetaManager:

`bootstrap(AppComponent, [MetaManager,provide('HANDLERS', {useValue: [DebugHandler]}) ]);`

Использование интерфейса для предоставления обработчиков:

export const HANDLERS: HandlerConfig = {handlers: [<Handler>DebugHandler]};

bootstrap(AppComponent, [MetaManager, provide(HandlerConfig, {useValue: HANDLERS}) ]);

Используя Handler[] класс провайдера:

bootstrap(AppComponent, [MetaManager, provide(Handler[], [DebugHandler])]);

Я хочу предоставить массив классов, потому что MetaManager в будущем потребуется иметь более одного обработчика, уведомление, ошибку и т. д.

РЕДАКТИРОВАТЬ:

Использование мульти-провайдера дает мне No provider for Array! (ApiService -> MetaManager -> Array) Ошибка:

мета-manager.ts:

@Injectable()
export class MetaManager{

    constructor(private handlers:Handler[]){
        console.log(handlers);
    }
}

main.ts:

bootstrap(AppComponent,
    [   MetaManager,
        provide(Handler, {useClass: DebugHandler, multi: true}),
        provide(Handler, {useClass: NotificationHandler, multi: true})]);

1 ответ

Решение

Вы могли бы использовать multi атрибут при регистрации ваших провайдеров для Handler учебный класс:

bootstrap(AppComponent, [
  MetaManager,
  provide(Handler, { useClass: DebugHandler, multi: true }),
  provide(Handler, { useClass: OtherHandler, multi: true })
]);

Таким образом, вы сможете ввести таким образом:

@Injectable()
export class MetaManager{
  constructor(@Inject(Handler) private handlers:Handler[]){
    console.log(handlers);
  }
}

Вот соответствующий план: https://plnkr.co/edit/UBIvWfOvAmo4XO2ohbID?p=preview. Эта статья может вас заинтересовать:

Другие вопросы по тегам