Я думаю, що відповіді вірні, але я думаю, що чогось не вистачає.
Те, чого бракує, - це "чому і що це вирішує?".
Добре, почнемо.
Спочатку згадаємо деяку інформацію:
Усі модулі мають доступ до кореневих служб.
Тож навіть ледачі завантажені модулі можуть використовувати послугу, яку надавали в app.module
.
Що станеться, якщо ледачий завантажений модуль надасть собі послугу, яку вже надав модуль додатків? буде 2 екземпляри.
Це не проблема, але іноді є .
Як ми можемо це вирішити? просто не імпортуйте модуль з цим провайдером до ледачих завантажених модулів.
Кінець історії.
Це ^ було просто для того, щоб показати, що ледачі завантажені модулі мають власну точку введення (на відміну від модулів, що не завантажуються).
Але що відбувається, коли спільний (!) Модуль оголосив providers
, і цей модуль імпортується ледачим і app.module
? Знову, як ми сказали, два екземпляри.
Тож як ми можемо вирішити це у спільному модулі POV? Нам потрібен спосіб не використовувати providers:[]
! Чому? тому що вони будуть автоматично імпортовані як на лінивий, так і на app.module, і ми не хочемо цього, як ми бачили, що у кожного буде інший екземпляр.
Ну, виявляється, що ми можемо оголосити спільний модуль, який не матиме providers:[]
, але все ж надасть провайдерів (вибачте :))
Як? Подобається це :
Зауважте, немає постачальників.
Але
що буде зараз, коли app.module імпортує спільний модуль з POV служби? НІЧОГО.
що буде зараз, коли ледачий модуль імпортує спільний модуль з POV служби? НІЧОГО.
Введення ручного механізму через конвенцію:
Ви помітите, що у постачальників зображень є service1
іservice2
Це дозволяє нам імпортувати service2
для ледачих завантажених модулів та service1
для нелених модулів. ( кашель ... роутер .... кашель )
До речі, ніхто не заважає тобі дзвонити forRoot
в межах ледачого модуля. але у вас буде два екземпляри, тому що ви app.module
також повинні це робити, тому не робіть цього в ледачих модулях.
Також - якщо app.module
дзвінки forRoot
(і ніхто не дзвонить forchild
) - це нормально, але кореневий інжектор буде лише service1
. (доступно для всіх додатків)
То навіщо нам це потрібно? Я б сказав:
Це дозволяє спільному модулю мати змогу розділити своїх різних постачальників для використання з нетерплячими модулями та ледачими модулями - через forRoot
та forChild
з'їзд. Повторюю: умовність
Це воно.
ЗАЧЕКАЙТЕ !! ні одного слова про одиночку ?? так чому я читаю одиночну всюди?
Ну - це приховано у реченні вище ^
Це дозволяє спільному модулю мати можливість розділити своїх різних постачальників, щоб їх використовувати з нетерплячими модулями та ледачими модулями - через forRoot та forChild .
Конвенції (!!!) дозволяє йому бути Сінглтон - або , щоб бути більш точним - якщо ви не будете дотримуватися угоди - ви НЕ отримаєте Сінглтон.
Отже, якщо ви завантажуєте лише forRoot
в app.module
, тоді ви отримуєте лише один екземпляр, тому що ви повинні викликати forRoot
його лише в app.module
.
BTW - у цей момент можна забути forChild
. ледачий завантажений модуль не повинен / не дзвонить forRoot
- значить, ви в безпеці в POV одиночної.
forRoot і forChild - це не один нерозривний пакет - це просто те, що немає сенсу закликати Root, який, очевидно, буде завантажений лише app.module
без надання можливостей для ледачих модулів, власних служб, без створення нових служб, які повинні бути -синглтон.
Ця умова дає вам приємну можливість forChild
- споживати "послуги лише для ледачих завантажених модулів".
Ось демонстрація Root постачальників дає позитивні цифри, ледачі завантажені модулі дають негативні числа.