Angular:查找实现特定接口的所有提供者

时间:2018-01-22 13:08:24

标签: angular strategy-pattern service-locator

在我的Angular(4+)应用程序中,我想创建一个基本的插件机制:

  • 扩展点定义为接口
  • 扩展程序实现该接口
  • 要查找所有扩展,我需要在运行时发现该接口的实现。

示例:接口SearchStrategy包含实现PersonSearchStrategyDocumentSearchStrategy(两种服务,都注册为提供者)。

有没有办法通过查询SearchStrategy界面的实现来动态获取这些服务的实例?如何?

(可能是某些Injector相关功能?)

1 个答案:

答案 0 :(得分:5)

如果您使用InjectionToken注册服务并使用提供multi,则可以提供。

您可以使用界面创建注入令牌。

export const SearchStrategyToken = new InjectionToken<SearchStrategy[]>('SearchStrategy');

在您的模块寄存器中:

providers: [
  {provide: SearchStrategyToken, useClass: PersonSearchStrategy, multi: true}, 
  {provide: SearchStrategyToken, useClass: DocumentSearchStrategy, multi: true},
]

在您的组件或服务中:

constructor(private injector: Injector) {

  const services = this.injector
  .get(SearchStrategyToken); // return 2 items [ PersonSearchStrategy, DocumentSearchStrategy ]

  const personSearch = services.find(x => x.constructor.name === 'PersonSearchStrategy');

  const docSearch = services.find(x => x.constructor.name === 'DocumentSearchStrategy');

}

此处提供的代码示例:https://stackblitz.com/edit/angular-clxr6k

但是,如果您提供有关用例的更多详细信息,那将是一件好事。可能有比上述路线更好的解决方案。