मैंने LogService को दो मॉड्यूल में प्रदाता के रूप में बनाया है। अब मेरे ऐप मॉड्यूल में मैं दोनों मॉड्यूल आयात कर रहा हूं। चूंकि हमने दो मॉड्यूल में प्रदाता पंजीकृत किया है, मुझे लगता है कि हमारे पास दो मॉड्यूल स्तरों पर LogService के दो उदाहरण होंगे। अब जब हम दोनों को AppModule में आयात करते हैं तो हम किस उदाहरण का उपयोग करने जा रहे हैं? क्या यह पहला आयातित मॉड्यूल प्रदाता होगा या अंतिम आयातित मॉड्यूल प्रदाता होगा? कृपया निम्नलिखित कोड पर एक नज़र डालें

log.service.ts
--------------
@Injectable()
export class LogService {
   private data: number = 45;
}

log.module.ts
-------------
import {LogService} from "./log.service"; 
@NgModule({providers : [LogService]})
export class LogModule{}

logger.module.ts
----------------
import {LogService} from "./log.service"; 
@NgModule({providers : [LogService]})
export class LoggerModule{}

app.module.ts
-------------
@NgModule({imports : [BrowserModule, LogModule, LoggerModule]})
export class AppModule{}

app.component.ts
----------------
import {LogService} from "./log.service"; 
@Component({})
export class AppComponent{
   // will the instance be from LogModule or LoggerModule?
   // If I want to explicitly get the instance of LoggerModule then How do I specify?
   constructor(private logService: LogService){}
}
0
user3205479 18 जुलाई 2017, 20:13
क्या LogService उदाहरण app.component.ts में आपके LogService आयात विवरण पर आधारित नहीं होना चाहिए?
 – 
Ashish Bajpai
18 जुलाई 2017, 20:34
कथन log.service.ts आयात करता है न कि log.module.ts और न ही looger.module.ts। कृपया कोड देखें
 – 
user3205479
18 जुलाई 2017, 20:42

1 उत्तर

सबसे बढ़िया उत्तर

एक सेवा को केवल एक बार इंजेक्टर के साथ पंजीकृत किया जाना चाहिए, जिसका अर्थ है कि इसे केवल एक मॉड्यूल के providers सरणी में सूचीबद्ध किया जाना चाहिए।

अपनी साझा सेवाओं के लिए एक core module बनाने पर विचार करें, जिसका विवरण यहां दिया गया है: https:// angular.io/guide/ngmodule#the-core-module

import { NgModule }       from '@angular/core';

import { CommonModule }      from '@angular/common';

import { TitleComponent }    from './title.component';
import { UserService }       from './user.service';
@NgModule({
  imports:      [ CommonModule ],
  declarations: [ TitleComponent ],
  exports:      [ TitleComponent ],
  providers:    [ UserService ]
})
export class CoreModule {
}

कोणीय डॉक्स यह कहते हैं कि कौन सी सेवा "जीतती है": https://angular.io/guide/ngmodule-faq#what-if-two-modules-provide-the-same-service

जब एक ही समय में लोड किए गए दो आयातित मॉड्यूल, एक ही टोकन वाले प्रदाता को सूचीबद्ध करते हैं, तो दूसरा मॉड्यूल प्रदाता "जीतता है"। ऐसा इसलिए है क्योंकि दोनों प्रदाताओं को एक ही इंजेक्टर में जोड़ा जाता है।

लेकिन उपाख्यानात्मक साक्ष्य यहां जो कहते हैं उससे मेल नहीं खाते। जिन देवों ने गलती से एक सेवा को कई बार पंजीकृत किया है, उन्होंने पाया कि यह कई उदाहरण बनाता है। इसलिए एक घटक से सेवा में निर्धारित मान दूसरे घटक से पुनर्प्राप्त करने के लिए उपलब्ध नहीं थे।

3
DeborahK 18 जुलाई 2017, 20:42
दस्तावेज़ पढ़ने से मुझे लगता है कि अंतिम आयातित मॉड्यूल सेवा रूट स्तर पर इंजेक्शन दी जाएगी। मेरे मामले में मुझे लगता है कि यह LoggerModule होगा लेकिन क्या हम वास्तव में मॉड्यूल निर्दिष्ट करके उदाहरण निर्दिष्ट कर सकते हैं
 – 
user3205479
18 जुलाई 2017, 20:45
5
मुझे पूरा यकीन है कि कई उदाहरण केवल आलसी लोड मॉड्यूल (जो अपना मूल दायरा प्राप्त करते हैं) से आते हैं और जब प्रदाता घटकों या निर्देशों में पंजीकृत होते हैं। आलसी लोड मॉड्यूल के लिए forRoot() लागू करें और वहां सेवा प्रदाता करें, फिर imports: [MyModulde.forRoot()] का उपयोग करके इस आलसी मॉड्यूल को आयात करें। गैर-आलसी-लोडेड मॉड्यूल के लिए इससे कोई फर्क नहीं पड़ता कि यह कितनी बार प्रदान किया जाता है, केवल एक उदाहरण बनाया जाएगा।
 – 
Günter Zöchbauer
18 जुलाई 2017, 20:45