Вставить массив классов
У меня есть класс 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. Эта статья может вас заинтересовать: