Angular 6 представил провайдеров с возможностью встряхивания деревьев с
@Inject({provideIn:'...'}
синтаксис.
Имеет ли значение для того, чтобы воспользоваться аспектом встряхивания дерева, внедряю ли я службу напрямую через конструктор или через инжектор?
Пример:
Сервис:
@Inject({provideIn:'...'}
class MyService {}
Потребитель1:
@Component()
class MyComponent {
constructor(s: MyService) {}
}
Потребитель2:
@Component()
class MyComponent {
constructor(@Inject(Injector) aInjector: Injector) {
const s: MyService = aInjector.get(MyService);
}
}
В обоих случаях внедряется MyService. Я ожидал, что только в первом случае компилятор AOT сможет определить, что сервис используется, с помощью статического анализа.
Какой был бы эффект, если бы я использовал вторую версию? Будет ли AOT обнаруживать инъекцию Injector, а затем пропускать встряхивание дерева для провайдеров? Или он достаточно умен, чтобы обнаружить, что MyService извлекается из инжектора?
В документации angular обсуждается использование инжектора здесь angular.io/guide/… Это не рекомендуется, но разрешено, но в документации не говорится о влиянии на дрожание дерева.