Angular 动态模块提供者

标签 angular dependency-injection module

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

我怎样才能实现这样的功能?

当然,我可以注入(inject)这两个服务,并在模块本身中确定它应该使用 DemoService 还是 UserService,但是这样模块就不能在其他地方重用了应用程序。

最佳答案

  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 的共享部分放到一个抽象类中,因此消费者应该依赖该接口(interface)。

  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
  });
}

希望,您已经有了想法...

关于Angular 动态模块提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082204/

相关文章:

dependency-injection - Guice 的实例方法

swift - 如何使用 swiftc 创建可导入的 Swift 库

angular - 理解@NgModule 的用法

angular - 如何使用 angular 2+ 和 typescript 获取所选行的元素并显示它

c# - Ninject:如何根据目标程序集绑定(bind)接口(interface)

python - Python 模块 INSTABOT 登录问题

Magento:如何覆盖本地模块中的模型

json - 以 Angular 将行追加到现有数据列表

authentication - 带有 auth0-lock 的 Auth0 仅在使用调试器时进行身份验证,以缓慢地逐步执行代码

.net - Web 服务的依赖注入(inject)?