Как мне сделать оформленный сервис инъекционным?

#angular #typescript

#angular #typescript

Вопрос:

У меня есть функция фабрики декораторов:

  export function CustomDecorator (dummyProp: string) {
    
    return function<T extends {new (...args: any[]): any}> (ctor: T) {
        @Injectable()
        class MyCustomClass extends ctor {
            myProp = dummyProp;
            constructor(..._: any[]) {
                super(_);
            }
        }
        return MyCustomClass;
    }
}
  

Затем у меня есть сервис, который я хочу сделать инъекционным, а также украшенным вышеуказанной функцией:

 @Injectable()
@CustomDecorator('helloWorld')
export class MyService {
   /* ... */
}
  

Однако это не работает, и я получаю следующую ошибку:
Нет поставщика для MyCustomClass!

Как мне заставить это работать?

Комментарии:

1. Если это еще не сделано, вам, вероятно, необходимо предоставить MyCustomClass (хотя это и service) в массиве provide модуля MyService

2. Вы не можете этого сделать, поскольку MyCustomClass создается во время выполнения.

Ответ №1:

Мне удалось заставить это работать, просто указав использование фабрики сервисов:

 @NgModule({
  ...
  providers: [
  {provide: MyService, useFactory: () => new MyService()}
]
})