在我的4+应用程序中,我想创建一个基本的插件机制:
例如:接口SearchStrategy
与实现PersonSearchStrategy
和DocumentSearchStrategy
(都是服务,注册为提供者)。
是否有一种方法可以通过查询SearchStrategy
接口的实现来动态获取这些服务的实例?如何实现?
(可能是一些与喷射器相关的功能?)
发布于 2018-01-22 06:31:05
如果您将服务注册到InjectionToken
并使用provided 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。
但是,如果您提供更多关于用例的详细信息,那就更好了。可能有更好的解决方案比走上述路线。
https://stackoverflow.com/questions/48382323
复制相似问题