угловая инъекция зависимости
В последнем выпуске угловых 6, служба регистрируется в модуле с помощью providedIn
свойства в метаданных службы:
@Injectable({
providedIn: 'root',
})
export class HeroService {}
Однако документация по-прежнему также относится к регистрации службы в массиве providers
модулей в метаданных модуля, как мы это делали в Angular 5:
@NgModule({
providers: [HeroService],
})
export class AppModule {}
Так,
- Какой метод должен использоваться для информирования инжектора об услуге, которую он должен внедрить?
- Будет ли устаревать метод массива
providers
модулей?
Ответы
Ответ 1
В принципе вы можете использовать либо, но в соответствии с новым интерфейсом CLI, provideIn
будет автоматически добавляться при создании service
providedIn
Теперь существует новый рекомендованный способ регистрации провайдера непосредственно внутри декоратора @Injectable()
с использованием нового атрибута @Injectable()
. Он принимает 'root'
как значение или любой модуль вашего приложения. Когда вы используете 'root'
, ваша инъекция будет зарегистрирована как односторонняя в приложении, и вам не нужно добавлять ее к поставщикам корневого модуля. Аналогичным образом, если вы используете providedIn: UsersModule
, инъекция регистрируется как поставщик UsersModule
без добавления его поставщикам модуля.
Этот новый способ был введен, чтобы лучше встряхнуть дерево в приложении. В настоящее время услуга, добавленная к поставщикам модуля, попадет в финальный пакет, даже если он не используется в приложении, что немного грустно.
Для получения дополнительной информации см. Здесь
Ответ 2
Как всегда, когда доступно несколько решений, это зависит от того, чего вы хотите достичь. Но документация дает вам некоторую директиву для выбора.
Иногда нежелательно иметь услугу всегда в инжекторе корневого приложения. Возможно, пользователи должны явно отказаться от использования службы, или услуга должна предоставляться в лениво загруженном контексте. В этом случае поставщик должен быть связан с определенным @NgModule class
и будет использоваться любым инжектором, который включает этот модуль.
Таким образом, в основном вы будете использовать providedIn: 'root'
для любых служб, которые широко применяются. Для других служб продолжайте использовать старую версию.
Не забывайте, что у вас уже был выбор для предоставления услуг по-разному. Например, также можно объявить Injectable на уровне компонента (это не изменяется в V6).
@Component({
selector: 'app-my-component',
templateUrl: './my.component.html',
providers: [ MyService ]
})
Таким образом, сервис становится доступным только в MyComponent
и его дереве подкомпонентов.
Ответ 3
Если вы используете угловой 5+ разработчик, он автоматически создаст инъецируемую службу, когда она будет объявлена как обеспечено: "root", в этом случае вам не потребуется импортировать службу в app.module.ts. Вы можете напрямую использовать его в другом компоненте.
Ответ 4
@NgModule()
и @Component()
имеют опцию метаданных провайдеров, где вы можете настроить провайдеров для инжекторов уровня NgModule или уровня компонента.
Декоратор @Injectable() имеет опцию метаданных обеспеченных в, где вы можете указать поставщика декорированного класса обслуживания с корневым инжектором или с инжектором для конкретного NgModule.
В вашем случае, поскольку он был предоставлен на уровне "root", нет необходимости добавлять его снова в качестве поставщика в модуле.
Подробнее о внедрении зависимостей здесь