我有一个应该根据路由器路径注入服务的模块,例如
对于具有/demo
的路径,它应该注入DemoService
;对于没有/demo
的路径,它应该提供UserService
。
如何实现此类功能?
我当然可以同时注入这两种服务,并在模块本身中确定应使用DemoService
还是UserService
,但是该模块将无法在其他应用中重用。
答案 0 :(得分:0)
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
});
}
希望,你有主意...