Comments 11
Приятно видеть ангуляр на хабре
Как по мне, так сложновато читать, когда половина текста жирным шрифтом
Ещё дополню примером
Если делать отдельный модуль и в нем предоставлять сервис, то в файле этого модуля можно подключить и настроить какие то сторонние библиотеки, которые не хочется подключать в главный модуль.
Т.е. например, у меня есть отдельный сервис для работы с модальными окнами, который является просто обёрткой над сторонним модулем. Сторонний модуль, в свою очередь, позволяет в импорте указать какие то настройки, через forRoot({someKey: someValue}). Если я укажу у своего сервиса providedIn: 'root', то мне придётся сам сторонний модуль подключать и конфигурировать в AppModule.
Если же я сделаю отдельный модуль для работы с модальными окнами, то в нём я смогу подключить стороннюю либу и настроить её корректно, но добавляя её в AppModule
И ещё полезно знать, что есть viewProviders, которые позволяют ограничить область сервиса на шаблон и всех его наследников.
Как правило, этот кейс не имеет смысла
Подключение сервиса в 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]})
Первый предоставляет один сервис для всех экземпляров компонента, второй — для каждого отдельный инстанс
По поводу Component({providers: [Service]}): angular.io/guide/providers Then each new instance of the UserEditorComponent gets its own cached service instance.
Ваша правда, нечасто пользуюсь данным функционалом, видимо неправильно отложилось в голове
Вот интересная статья про внедрение в компоненты и директивы Transclusion, Injection and Procrastination И к каким непредсказуемым последствиям это может привести.
А с тестами что изменилось? Ведь DI в Ангуляр по большей части для упрощения написания тестов и введен или нет?
В отличии от C# или Java, где по интерфейсу можно создавать моковые реализации классов для тестов в Angular внедрение зависимостей служит больше для управления сложностью.
С тестами ничего не изменилось.
Если нужно протестировать сервис у которого нет зависимостей или их мало, то можно создать экземпляр через new MyService()
Если нужно тестировать компонент или что-то другое во что внедряется сервис то все так-же создается тестовый модуль через TestBed и в секции providers: [] мокаются все зависимости.
С тестами ничего не изменилось.
Если нужно протестировать сервис у которого нет зависимостей или их мало, то можно создать экземпляр через new MyService()
Если нужно тестировать компонент или что-то другое во что внедряется сервис то все так-же создается тестовый модуль через TestBed и в секции providers: [] мокаются все зависимости.
Sign up to leave a comment.
Angular 6+ полное руководство по внедрению зависимостей. providedIn vs providers:[]