Tôi nghĩ các câu trả lời là đúng nhưng tôi nghĩ rằng một cái gì đó còn thiếu.
Điều còn thiếu là "tại sao và nó giải quyết được gì?".
Ok, bắt đầu thôi.
Đầu tiên, hãy đề cập đến một số thông tin:
Tất cả các mô-đun đều có quyền truy cập vào các dịch vụ gốc.
Vì vậy, ngay cả các mô-đun được tải lười biếng cũng có thể sử dụng một dịch vụ được cung cấp trong app.module
.
Điều gì sẽ xảy ra nếu một mô-đun được tải chậm sẽ cung cấp cho chính nó một dịch vụ mà mô-đun ứng dụng đã cung cấp? sẽ có 2 trường hợp.
Nó không phải là một vấn đề nhưng đôi khi nó là như vậy .
Làm thế nào chúng ta có thể giải quyết nó ? chỉ cần không nhập một mô-đun với nhà cung cấp đó vào các mô-đun được tải chậm.
Kết thúc câu chuyện.
^ Này chỉ để cho thấy rằng các mô-đun được tải lười biếng có điểm tiêm riêng của chúng (trái ngược với các mô-đun không được tải lười biếng).
Nhưng điều gì sẽ xảy ra khi một mô-đun chia sẻ (!) Đã khai báo providers
và mô-đun đó được nhập bởi lazy và app.module
? Một lần nữa, như chúng tôi đã nói, hai trường hợp.
Vậy làm thế nào chúng ta có thể giải quyết điều này trong POV mô-đun chia sẻ? Chúng tôi cần một cách để không sử dụng providers:[]
! Tại sao? bởi vì chúng sẽ được tự động nhập vào cả lazy và app.module và chúng tôi không muốn điều đó như chúng ta đã thấy rằng mỗi cái sẽ có một phiên bản khác nhau.
Chà, hóa ra chúng ta có thể khai báo một mô-đun được chia sẻ sẽ không có providers:[]
, nhưng vẫn sẽ cung cấp cho các nhà cung cấp (xin lỗi :))
Làm sao? Như thế này :
Thông báo, không có nhà cung cấp.
Nhưng
điều gì sẽ xảy ra bây giờ khi app.module sẽ nhập mô-đun được chia sẻ với POV của dịch vụ? KHÔNG CÓ GÌ.
điều gì sẽ xảy ra bây giờ khi một mô-đun lười biếng sẽ nhập mô-đun được chia sẻ với POV của dịch vụ? KHÔNG CÓ GÌ.
Nhập cơ chế Thủ công thông qua quy ước:
Bạn sẽ nhận thấy rằng các nhà cung cấp trong hình ảnh có service1
vàservice2
Điều này cho phép chúng tôi nhập service2
cho các mô-đun được tải chậm và service1
cho các mô-đun không lười. ( khụ ... bộ định tuyến .... khụ )
BTW, không ai ngăn cản bạn gọi forRoot
trong mô-đun lười biếng. nhưng bạn sẽ có 2 trường hợp vì app.module
cũng nên làm điều đó - vì vậy đừng làm điều đó trong các mô-đun lười biếng.
Ngoài ra - nếu app.module
cuộc gọi forRoot
(và không có ai gọi forchild
) - điều đó tốt, nhưng bộ phun gốc sẽ chỉ cóservice1
. (có sẵn cho tất cả các ứng dụng)
Vậy tại sao chúng ta cần nó? Tôi sẽ nói :
Nó cho phép một mô-đun được chia sẻ, có thể phân chia các nhà cung cấp khác nhau của nó để được sử dụng với các mô-đun háo hức và mô-đun lười biếng - thông qua forRoot
và forChild
quy ước. Tôi nhắc lại: quy ước
Đó là nó.
CHỜ ĐỢI !! không một từ nào về singleton ?? vậy tại sao tôi đọc singleton ở khắp mọi nơi?
Chà - nó ẩn trong câu trên ^
Nó cho phép một mô-đun được chia sẻ, có thể phân chia các nhà cung cấp khác nhau của nó để được sử dụng với các mô-đun háo hức và mô-đun lười biếng - thông qua forRoot và forChild .
Quy ước (!!!) cho phép nó là singleton - hay chính xác hơn - nếu bạn không tuân theo quy ước - bạn sẽ KHÔNG nhận được singleton.
Vì vậy, nếu bạn chỉ tải forRoot
trong app.module
, thì bạn chỉ nhận được một thể hiện vì bạn chỉ nên gọi forRoot
nó trong app.module
.
BTW - tại thời điểm này bạn có thể quên forChild
. mô-đun được tải lười biếng không nên / sẽ không gọiforRoot
- vì vậy bạn an toàn trong POV của singleton.
forRoot và forChild không phải là một gói không thể phá vỡ - chỉ là không có điểm nào để gọi Root mà rõ ràng là sẽ chỉ được tải trong app.module
mà không cung cấp khả năng cho các mô-đun lười biếng, có các dịch vụ của riêng họ, mà không cần tạo dịch vụ mới-mà-nên-có -singleton.
Quy ước này cung cấp cho bạn một khả năng tuyệt vời được gọi là forChild
- sử dụng "dịch vụ chỉ dành cho các mô-đun được tải chậm".
Đây là một bản demo Các nhà cung cấp gốc mang lại số dương, các mô-đun được tải chậm cho ra số âm.