Вы должны использовать глобальный объект хранения для своих токенов.Я рекомендую вам использовать карту.
export const tokens: Map<string, InjectionToken<IServiceRef>> = new Map();
tokens.set('tokenName', new InjectionToken<IServiceRef>('tokenName'));
Вы должны использовать объект карты для объявления провайдера.
@NgModule({
providers: [
{provide: tokens.get('tokenName'), useValue: new Service()}
]
);
Теперь вы можете искать токен через строковое значение.
this.service = this.injector.get(tokens.get(the_token_name));
Я не знал, что это изменилось в Angular 6, но я напоминаю, что в документации сказано, что токены являются ссылочными значениями.Это означает, что DI использует ===
для сопоставления зависимостей.
Вы получите коллизии в DI, если сопоставите по именам токенов.Многие библиотеки объявляют токен «документ» в качестве примера.Таким образом, вы не хотите использовать строковые имена.Так как столкновение будет крайне сложно найти и исправить.