Как на лету чередовать реализацию класса обслуживания в компонентном провайдере? - PullRequest
0 голосов
/ 16 октября 2019

Я все еще новичок в Angular. В настоящее время у меня есть две реализации службы REST на основе одного абстрактного класса в одном из наших компонентов. Как и в этом сценарии , единственное отличие состоит в том, что я внедряю службу на уровне компонента:

@Component({
  selector: 'this-is-tag',
  template: htmlStr,
  providers: [{ provide: RESTToken, useClass: FirstRESTService }],
  ...

Вопрос в том, могу ли я переключить реализацию на время выполнения, основываясь на конкретной конфигурации? Или я должен использовать другой подход для этой проблемы?

EDIT:

Похоже, мне нужно использовать интерфейс, а не абстрактный класс здесь. ссылка

1 Ответ

0 голосов
/ 16 октября 2019

Решением является useFactory вместо UseClass, измените код, как показано в следующем примере: сначала создайте класс фабрики с решением по логике DI:

export function myFactory() {
  if(myRule){
       return new FirstRESTService();
    }
  return new  SecondRESTService();
}

Затем измените код компонента на:

@Component({
  selector: 'this-is-tag',
  template: htmlStr,
  providers: [{ provide: RESTToken, useFactory: myFactory}],

Иногда возникает ситуация, когда вы хотите добавить некоторые зависимости к фабрике, потому что она нужна вам, чтобы решить, следует ли возвращать serviceA или serviceB. Для этого мы можем использовать свойство deps следующим образом:

export function myFactory(obj:MyDependencyClass) {
  if(obj.HasMyRule){
       return new FirstRESTService();
    }
  return new  SecondRESTService();
}

также в вашем компоненте:

@Component({
  selector: 'this-is-tag',
  template: htmlStr,
  providers: [{ provide: RESTToken, useFactory: myFactory}],
  deps: [MyDependencyClass]

, но не забудьте включить MyDependencyClass в app.module.ts.

...