- Определите тип для провайдера, скажем, в вашем случае у вас может быть провайдер класса, например, фабричный класс, например,
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 ваших сервисов в абстрактный класс, поэтому потребители должны полагаться на интерфейс.
- В вашем модуле, который должен предоставлять либо
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]
}],
- В вашем потребительском компоненте вы теперь можете получить доступ к конкретной услуге через
ServiceFactory
, которая должна обеспечить надлежащую услугу
constructor(private factoryService: FactoryService) {
this.factoryService.activeService.subscribe((activeService: DataService) => {
// Here you can now do stuff with an proper service
});
}
Надеюсь, у вас есть идея ...