Я думаю, что ответы верны, но я думаю, что чего-то не хватает.
Не хватает того, «почему и что это решает?».
Хорошо, давайте начнем.
Сначала упомянем некоторую информацию:
Все модули имеют доступ к корневым службам.
Таким образом, даже ленивые модули могут использовать службу, которая была предоставлена в app.module
.
Что произойдет, если ленивый загруженный модуль предоставит себе услугу, которую уже предоставил модуль приложения? будет 2 экземпляра.
Это не проблема, но иногда бывает .
Как мы можем это решить? просто не импортируйте модуль с этим поставщиком в модули с отложенной загрузкой.
Конец истории.
Это ^ было просто для того, чтобы показать, что модули с ленивой загрузкой имеют свою собственную точку внедрения (в отличие от модулей с ленивой загрузкой).
Но что произойдет, если объявлен разделяемый (!) Модуль providers
, и этот модуль будет импортирован ленивым и app.module
? Опять же, как мы уже сказали, два случая.
Итак, как мы можем решить эту проблему в общем модуле POV? Нам нужен способ не использовать providers:[]
! Зачем? потому что они будут автоматически импортированы как в ленивый, так и в app.module, и мы этого не хотим, поскольку мы видели, что у каждого будет свой экземпляр.
Что ж, получается, что мы можем объявить общий модуль, который не будет иметь providers:[]
, но все же предоставит провайдеров (извините :))
Как? Как это :
Заметьте, нет провайдеров.
Но
что будет теперь, когда app.module импортирует общий модуль с POV сервиса? НИЧЕГО.
что будет теперь, когда ленивый модуль импортирует общий модуль с POV службы? НИЧЕГО.
Ввод ручного механизма через соглашение:
Вы заметите, что у провайдеров на картинках есть service1
иservice2
Это позволяет нам импортировать service2
как ленивые, так и service1
неленивые модули. ( кашель ... роутер .... кашель )
Кстати, никто не мешает вам звонить forRoot
в ленивом модуле. но у вас будет 2 экземпляра, потому app.module
что это тоже должно быть - так что не делайте этого в ленивых модулях.
Также - если app.module
звонит forRoot
(а никто не звонит forchild
) - нормально, но root-инжектор будет только service1
. (доступно для всех приложений)
Так зачем нам это нужно? Я бы сказал :
Это позволяет разделяемому модулю иметь возможность разделить своих разных поставщиков для использования с нетерпеливыми модулями и ленивыми модулями - через forRoot
и forChild
соглашение. Повторяю: условность
Вот и все.
ПОДОЖДИТЕ !! ни слова про синглтон ?? так почему я везде читаю синглтон?
Что ж - это скрыто в предложении выше ^
Это позволяет разделяемому модулю иметь возможность разделить своих разных поставщиков для использования с нетерпеливыми модулями и ленивыми модулями - через forRoot и forChild .
Конвенции (!!!) позволяет ему быть синглтон - или , чтобы быть более точным - если вы не будете следовать соглашению - вы НЕ получите синглтон.
Итак, если вы загружаете только forRoot
в app.module
, то вы получаете только один экземпляр, потому что вы должны вызывать forRoot
его только в app.module
.
Кстати - на этом этапе можно забыть forChild
. ленивый загруженный модуль не должен / не будет вызывать forRoot
- так что вы в безопасности в POV синглтона.
forRoot и forChild - это не один нерушимый пакет - просто нет смысла вызывать Root, который, очевидно, будет загружен только в, app.module
без предоставления возможности для ленивых модулей, иметь свои собственные службы, без создания новых служб, которые должны быть -одинарный.
Это соглашение дает вам прекрасную возможность, называемую forChild
- потреблять «услуги только для ленивых загружаемых модулей».
Вот демо Root-провайдеры дают положительные числа, ленивые загруженные модули дают отрицательные числа.