Pull to refresh

Comments 11

Как по мне, так сложновато читать, когда половина текста жирным шрифтом

Хотел подчеркнуть основные мысли. Приму к сведению.
Ещё дополню примером

Как правило, этот кейс не имеет смысла

Подключение сервиса в EagerModule может использоваться для инкапсуляции

Если делать отдельный модуль и в нем предоставлять сервис, то в файле этого модуля можно подключить и настроить какие то сторонние библиотеки, которые не хочется подключать в главный модуль.
Т.е. например, у меня есть отдельный сервис для работы с модальными окнами, который является просто обёрткой над сторонним модулем. Сторонний модуль, в свою очередь, позволяет в импорте указать какие то настройки, через forRoot({someKey: someValue}). Если я укажу у своего сервиса providedIn: 'root', то мне придётся сам сторонний модуль подключать и конфигурировать в AppModule.
Если же я сделаю отдельный модуль для работы с модальными окнами, то в нём я смогу подключить стороннюю либу и настроить её корректно, но добавляя её в AppModule

И ещё полезно знать, что есть viewProviders, которые позволяют ограничить область сервиса на шаблон и всех его наследников.
Если делать отдельный модуль и в нем предоставлять сервис, то в файле этого модуля можно подключить и настроить какие то сторонние библиотеки, которые не хочется подключать в главный модуль.

В таком случае рекомендуется использовать для модуля providers: []
Если действительно понадобится ограничить область видимости сервиса, проще воспользоваться старым способом providers:[], так как он точно не приведет к циклическим зависимостям.


И ещё полезно знать, что есть viewProviders, которые позволяют ограничить область сервиса на шаблон и всех его наследников.

Об этом написано в разделах Внедрение в @Сomponent и @Directive и Внедрение сервиса в компонент (providedIn: SomeComponent)
Об этом написано в разделах Внедрение в @Сomponent и @Directive и Внедрение сервиса в компонент (providedIn: SomeComponent)


Component({providers: [Service]}) не равно Component({viewProviders: [Service]})
Первый предоставляет один сервис для всех экземпляров компонента, второй — для каждого отдельный инстанс
Ваша правда, нечасто пользуюсь данным функционалом, видимо неправильно отложилось в голове
Вот интересная статья про внедрение в компоненты и директивы Transclusion, Injection and Procrastination И к каким непредсказуемым последствиям это может привести.
А с тестами что изменилось? Ведь DI в Ангуляр по большей части для упрощения написания тестов и введен или нет?
В отличии от C# или Java, где по интерфейсу можно создавать моковые реализации классов для тестов в Angular внедрение зависимостей служит больше для управления сложностью.

С тестами ничего не изменилось.

Если нужно протестировать сервис у которого нет зависимостей или их мало, то можно создать экземпляр через new MyService()

Если нужно тестировать компонент или что-то другое во что внедряется сервис то все так-же создается тестовый модуль через TestBed и в секции providers: [] мокаются все зависимости.
Sign up to leave a comment.

Articles