Saya pikir jawabannya benar tetapi saya pikir ada sesuatu yang hilang.
Hal yang kurang adalah "mengapa dan apa yang dipecahkannya?".
Ok mari kita mulai.
Pertama mari kita sebutkan beberapa info:
Semua modul memiliki akses ke layanan root.
Jadi, bahkan modul yang dimuat lambat dapat menggunakan layanan yang disediakan di app.module
.
Apa yang akan terjadi jika modul yang dimuat lambat akan menyediakan layanan yang telah disediakan oleh modul aplikasi itu sendiri? akan ada 2 contoh.
Itu bukan masalah tapi terkadang memang begitu .
Bagaimana kita bisa mengatasinya? cukup jangan mengimpor modul dengan penyedia tersebut ke modul yang dimuat lambat.
Akhir dari cerita.
^ Ini hanya untuk menunjukkan bahwa modul yang dimuat lambat memiliki titik injeksi mereka sendiri (berbeda dengan modul yang tidak dimuat dengan lambat).
Tetapi apa yang terjadi ketika modul bersama (!) Telah dideklarasikan providers
, dan modul itu diimpor oleh lazy dan app.module
? Sekali lagi, seperti yang kami katakan, dua contoh.
Jadi bagaimana kita bisa menyelesaikan ini di modul POV bersama? Kami membutuhkan cara untuk tidak menggunakan providers:[]
! Mengapa? karena keduanya akan diimpor secara otomatis ke penggunaan lazy dan app.module dan kami tidak menginginkannya karena kami melihat bahwa masing-masing akan memiliki instance yang berbeda.
Nah, ternyata kita dapat mendeklarasikan modul bersama yang tidak akan dimiliki providers:[]
, tetapi tetap akan menyediakan penyedia (maaf :))
Bagaimana? Seperti ini :
Perhatikan, tidak ada penyedia.
Tapi
apa yang akan terjadi sekarang ketika app.module akan mengimpor modul bersama dengan POV layanan? TIDAK ADA.
apa yang akan terjadi sekarang ketika modul malas akan mengimpor modul bersama dengan POV layanan? TIDAK ADA.
Memasuki mekanisme Manual melalui konvensi:
Anda akan melihat bahwa penyedia di gambar memiliki service1
danservice2
Ini memungkinkan kita untuk mengimpor service2
modul yang dimuat lambat dan service1
untuk modul non-malas. ( batuk ... router .... batuk )
BTW, tidak ada yang menghentikan Anda untuk menelepon forRoot
dalam modul malas. tetapi Anda akan memiliki 2 instance karena app.module
harus melakukannya - jadi jangan lakukan itu di modul lazy.
Juga - jika app.module
panggilan forRoot
(dan tidak ada yang memanggil forchild
) - tidak apa-apa, tetapi injektor akar hanya akan melakukannya service1
. (tersedia untuk semua aplikasi)
Jadi mengapa kita membutuhkannya? Aku akan mengatakan :
Ini memungkinkan modul bersama, untuk dapat membagi penyedia berbeda untuk digunakan dengan modul eager dan modul malas - melalui forRoot
dan forChild
konvensi. Saya ulangi: konvensi
Itu dia.
TUNGGU !! tidak ada satu kata pun tentang singleton ?? jadi mengapa saya membaca tunggal di mana-mana?
Nah - itu tersembunyi dalam kalimat di atas ^
Ini memungkinkan modul bersama, untuk dapat membagi penyedia yang berbeda untuk digunakan dengan modul eager dan modul malas - melalui forRoot dan forChild .
The konvensi (!!!) memungkinkan untuk menjadi tunggal - atau lebih tepatnya - jika Anda tidak akan mengikuti konvensi - Anda akan tidak mendapatkan tunggal.
Jadi jika Anda hanya memuat forRoot
di app.module
, maka Anda hanya mendapatkan satu contoh karena Anda hanya harus memanggilnya forRoot
di app.module
.
BTW - pada titik ini Anda bisa melupakan forChild
. modul yang dimuat malas seharusnya / tidak akan memanggil forRoot
- jadi Anda aman di POV tunggal.
forRoot dan forChild bukanlah satu paket yang tidak dapat dipecahkan - hanya saja tidak ada gunanya memanggil Root yang jelas hanya akan dimuat app.module
tanpa memberikan kemampuan untuk modul malas, memiliki layanan sendiri, tanpa membuat layanan baru-yang-seharusnya-ada. -singleton.
Konvensi ini memberi Anda kemampuan bagus yang dipanggil forChild
- untuk menggunakan "layanan hanya untuk modul yang dimuat lambat".
Berikut ini demo Penyedia root menghasilkan angka positif, modul yang dimuat lambat menghasilkan angka negatif.