在我的Angular(4+)应用程序中,我想创建一个基本的插件机制:
示例:接口SearchStrategy
包含实现PersonSearchStrategy
和DocumentSearchStrategy
(两种服务,都注册为提供者)。
有没有办法通过查询SearchStrategy
界面的实现来动态获取这些服务的实例?如何?
(可能是某些Injector相关功能?)
答案 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。
但是,如果您提供有关用例的更多详细信息,那将是一件好事。可能有比上述路线更好的解决方案。