我有一个模块应该根据路由器路径注入(inject)服务,例如
对于带有 /demo
的路径,它应该注入(inject)一个 DemoService
,对于没有 /demo
的路径,它应该提供一个 UserService
.
我怎样才能实现这样的功能?
当然,我可以注入(inject)这两个服务,并在模块本身中确定它应该使用 DemoService
还是 UserService
,但是这样模块就不能在其他地方重用了应用程序。
最佳答案
- 为提供者定义一个类型,比方说,在您的情况下,您可以拥有一个类提供者,例如工厂类,例如
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 的共享部分放到一个抽象类中,因此消费者应该依赖该接口(interface)。
- 在您应该提供
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
});
}
希望,您已经有了想法...
关于Angular 动态模块提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082204/