Поставщик угловых динамических модулей - PullRequest
3 голосов
/ 10 марта 2019

У меня есть модуль, который должен был внедрить службу в зависимости от пути маршрутизатора, например, для пути с /demo он должен был ввести DemoService, а для путей без /demo он должен был предоставить UserService.

Как я могу реализовать такую ​​функциональность?

Конечно, я мог бы внедрить обе службы и в самом модуле определить, должен ли он использовать DemoService или UserService, но затем модульне будет использоваться в других приложениях.

1 Ответ

0 голосов
/ 10 марта 2019
  1. Определите тип для провайдера, скажем, в вашем случае у вас может быть провайдер класса, например, фабричный класс, например,
abstract class DataService {
  abstract doSomething(): void;
}

class FactoryService {
  activeService = new BehaviorSubject<DataService>();

  getService(): Observable<DataService> {
    return this.activeService.asObservable();
  }
}

class DemoService extends DataService {
  doSomething(): void {
    console.log('DemoService');
  }
}
class UserService extends DataService {
  doSomething(): void {
    console.log('UserService');
  }
}

переносит общие части API ваших сервисов в абстрактный класс, поэтому потребители должны полагаться на интерфейс.

  1. В вашем модуле, который должен предоставлять либо DemoService, либо UserService, определите вашего провайдера как фабрику, например
providers: [{
  provide: FactoryService,
  useFactory: (route: ActivatedRoute) => {
    const factoryService = new FactoryService();
    const url = route['_routerState'].snapshot.url;

    url.startsWith('/demo/')
      ? factoryService.activeService.next(new DemoService())
      : factoryService.activeService.next(new UserService());

    return factoryService;
  }
  deps: [ActivatedRoute]
}],
  1. В вашем потребительском компоненте вы теперь можете получить доступ к конкретной услуге через ServiceFactory, которая должна обеспечить надлежащую услугу
constructor(private factoryService: FactoryService) {
  this.factoryService.activeService.subscribe((activeService: DataService) => {
    // Here you can now do stuff with an proper service
  });
}

Надеюсь, у вас есть идея ...

...