Angular动态模块提供程序

时间:2019-03-09 21:37:26

标签: angular dependency-injection module

我有一个应该根据路由器路径注入服务的模块,例如 对于具有/demo的路径,它应该注入DemoService;对于没有/demo的路径,它应该提供UserService

如何实现此类功能?

我当然可以同时注入这两种服务,并在模块本身中确定应使用DemoService还是UserService,但是该模块将无法在其他应用中重用。

1 个答案:

答案 0 :(得分:0)

  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. 在应提供DemoServiceUserService的模块中,将您的提供者定义为工厂,例如
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
  });
}

希望,你有主意...