कोणीय 6 में सेवाएँ सृजित करते समय इंजेक्टेबल डेकोरेटर के साथ provideIn का उद्देश्य क्या है?


136

जब कोणीय सीएलआई में सेवाएं सृजित की जाती हैं, तो यह इंजेक्टेबल डेकोरेटर के लिए 'रूट' के डिफॉल्ट के साथ प्रॉपर्टी में 'अतिरिक्त' के साथ अतिरिक्त मेटाडेटा जोड़ रहा है।

@Injectable({
  providedIn: 'root',
})

वास्तव में क्या प्रदान करता है? मैं यह मान रहा हूं कि यह सेवा पूरे एप्लिकेशन के लिए 'वैश्विक' प्रकार की सिंगलटन सेवा की तरह उपलब्ध है, हालांकि, AppModule के प्रदाता सरणी में ऐसी सेवाओं की घोषणा करने के लिए क्लीनर नहीं होगा?

अपडेट करें:

किसी और के लिए, निम्नलिखित पैराग्राफ ने इसकी एक और अच्छी व्याख्या प्रदान की, विशेष रूप से यदि आप केवल एक फीचर मॉड्यूल को अपनी सेवा प्रदान करना चाहते हैं।

अब एक नई, अनुशंसित, एक प्रदाता को पंजीकृत करने का तरीका है, सीधे @Injectable()डेकोरेटर के अंदर , नई providedIn विशेषता का उपयोग करके । यह 'root'आपके एप्लिकेशन के मूल्य या किसी भी मॉड्यूल के रूप में स्वीकार करता है । जब आप उपयोग करते हैं 'root', तो आपके injectableएप्लिकेशन में एक सिंगलटन के रूप में पंजीकृत किया जाएगा, और आपको इसे रूट मॉड्यूल के प्रदाताओं में जोड़ने की आवश्यकता नहीं है। इसी तरह, यदि आप उपयोग करते हैं providedIn: UsersModule, तो इसे मॉड्यूल में जोड़े बिना injectableप्रदाता के रूप में पंजीकृत किया जाता है । "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /UsersModuleproviders

अद्यतन 2:

आगे की जांच के बाद, मैंने फैसला किया है कि यह केवल उपयोगी है providedIn: 'root'

यदि आप provideरूट मॉड्यूल के अलावा किसी अन्य मॉड्यूल में सेवा करना चाहते हैं , तो आप providersसुविधा मॉड्यूल के सज्जाकारों में सरणी का उपयोग करने से बेहतर हैं , अन्यथा आप परिपत्र निर्भरता से ग्रस्त हो जाएंगे। यहाँ होने वाली दिलचस्प चर्चाएँ - https://github.com/angular/angular-cli/issues/10170


17
मुझे लगता है कि आपके अपडेट को आपके प्रश्न में जोड़ने के बजाय एक उत्तर होना चाहिए (आप अपने स्वयं के प्रश्नों का उत्तर दे सकते हैं)।
फोनिक्स

सबसे महत्वपूर्ण हिस्सा सिंघलोन है, कोई भी इसका उल्लेख नहीं करता है!
काइल बर्केट

जवाबों:


54

यदि आप provideIn का उपयोग करते हैं, तो इंजेक्टेबल मॉड्यूल के प्रदाताओं को जोड़ने के बिना मॉड्यूल के प्रदाता के रूप में पंजीकृत होता है।

से Docs

सेवा अपने आप में एक वर्ग है जिसे सीएलआई ने उत्पन्न किया है और जिसे @ इंजेक्शन के साथ सजाया गया है। डिफ़ॉल्ट रूप से, यह डेकोरेटर प्रदान की गई संपत्ति के साथ कॉन्फ़िगर किया गया है, जो सेवा के लिए एक प्रदाता बनाता है। इस स्थिति में, प्रदान किया गया: 'रूट' निर्दिष्ट करता है कि सेवा को रूट इंजेक्टर में प्रदान किया जाना चाहिए।


4
धन्यवाद सजेतीहरण। ठीक है, इसलिए ऐसा लगता है कि यह निर्दिष्ट करने का एक नया शॉर्टकट तरीका है जहां सेवा प्रदान की जानी चाहिए। मुझे लगता है कि मेरी प्रारंभिक वरीयता प्रोवाइडइन टैग के लिए बिखरे हुए कोड आधार को
नष्ट करने के

2
क्या इसको जोड़ने के लिए कोणीय का कोई कारण था? वहाँ एक समस्या यह हल है? मुझे नहीं लगता कि इसका कोई कारण है।
प्रोलिंक 007

3
AppModule / CoreModule की परिभाषा को थोड़ा छोटा रखता है;)
स्टीफन ज़्वोनार

22
@ prolink007। प्रदत्त का उपयोग करते हुए, एप्लिकेशन द्वारा सेवाओं को आलसी-भारित होने की अनुमति देता है। इसे जांचने के लिए, अपनी सेवाओं में कंसोल लॉग डालें। मेरा होम पेज 16 सेवाओं को लोड करता था, अब यह 9 लोड करता है। प्रदर्शन को निर्धारित करना मुश्किल है, लेकिन मुझे यह जानकर बेहतर लगता है कि मैं सेवाओं को लोड नहीं कर रहा हूं जब तक कि वे ज़रूरत न हों :)।
स्टेवेटेमाक्ग्युई

3
आप डेकोरेटर providedInका उपयोग करते समय सेवा को आरंभिक रूप से परिभाषित करने के लिए विशेषता का उपयोग करके अपनी सेवाओं को वृक्ष-शक्की बना सकते हैं @Injectable()। फिर आपको इसे अपने NgModuleघोषणा पत्र की प्रदाताओं की विशेषता और साथ ही इसके आयात विवरण से हटा देना चाहिए । यह बंडल से अप्रयुक्त कोड को हटाकर बंडल आकार को कम करने में मदद कर सकता है।
nircraft

48

providedIn: 'root' कोणीय 6 के बाद से सेवाएं प्रदान करने का सबसे आसान और कुशल तरीका है:

  1. यह सेवा एक सिंग्लटन के रूप में व्यापक रूप से उपलब्ध होगी, जिसमें इसे मॉड्यूल प्रदाता के सरणी में जोड़ने की कोई आवश्यकता नहीं है (जैसे कि कोणीय <= 5)।
  2. यदि सेवा केवल एक आलसी लोड किए गए मॉड्यूल के भीतर उपयोग की जाती है, तो यह उस मॉड्यूल के साथ आलसी लोड की जाएगी
  3. यदि इसका उपयोग कभी नहीं किया जाता है, तो यह निर्माण (पेड़ शेक) में निहित नहीं होगा।

आगे informations के लिए प्रलेखन और NgModule FAQs पढ़ने पर विचार करें

btw:

  1. यदि आप नहीं चाहते हैं कि एप्लिकेशन-वाइड सिंगलटन एक घटक के बजाय प्रदाता के सरणी का उपयोग करें।
  2. यदि आप दायरे को सीमित करना चाहते हैं तो कोई अन्य डेवलपर कभी भी आपकी सेवा का उपयोग किसी विशेष मॉड्यूल के बाहर नहीं करेगा, providersइसके बजाय NgModule के सरणी का उपयोग करें ।

37

डॉक्स से

इंजेक्टेबल डेकोरेटर क्या है?

सृजन के लिए इंजेक्टर के रूप में उपलब्ध एक वर्ग को चिह्नित करता है।

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

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

सेवा अपने आप में एक वर्ग है जिसे सीएलआई ने उत्पन्न किया है और जिसे @Injectable () के साथ सजाया गया है।

वास्तव में क्या प्रदान करता है?

यह निर्धारित करता है कि कौन से इंजेक्टर इंजेक्शन को उपलब्ध कराएंगे, या तो इसे @NgModule या अन्य InjectorType के साथ जोड़कर, या यह निर्दिष्ट करके कि यह इंजेक्टेबल 'रूट' इंजेक्टर में प्रदान किया जाना चाहिए, जो कि अधिकांश ऐप में एप्लिकेशन-स्तरीय इंजेक्टर होगा।

providedIn: Type<any> | 'root' | null

प्रदान की गई: 'रूट'

जब आप रूट स्तर पर सेवा प्रदान करते हैं, तो एंगुलर सेवा का एक एकल, साझा उदाहरण बनाता है और इसे किसी भी वर्ग में इंजेक्ट करता है जो इसके लिए पूछता है। प्रदाता को @Injectable () मेटाडेटा में पंजीकृत करने से यह भी उपयोग नहीं होने पर संकलित ऐप से सेवा को हटाकर कोणीय को एक ऐप का अनुकूलन करने की अनुमति देता है।

प्रदान की: मॉड्यूल

यह निर्दिष्ट करना भी संभव है कि किसी विशेष @NgModule में एक सेवा प्रदान की जानी चाहिए। उदाहरण के लिए, यदि आप नहीं चाहते कि कोई सेवा अनुप्रयोगों के लिए उपलब्ध हो, जब तक कि वे आपके द्वारा बनाए गए मॉड्यूल का आयात न करें, आप यह निर्दिष्ट कर सकते हैं कि सेवा को मॉड्यूल में प्रदान किया जाना चाहिए

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

यह विधि पसंद की जाती है क्योंकि यह ट्री-शेकिंग को सक्षम बनाता है ( ट्री शेकिंग एक बिल्ड प्रक्रिया में एक कदम है जो सेवा के अप्रयुक्त कोड को हटा देता है ) यदि यह कुछ भी इंजेक्ट नहीं करता है।

यदि सेवा में यह निर्दिष्ट करना संभव नहीं है कि कौन सा मॉड्यूल इसे प्रदान करना चाहिए, तो आप मॉड्यूल के भीतर सेवा के लिए एक प्रदाता भी घोषित कर सकते हैं:

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}

4
सबसे अच्छी व्याख्या।
एनओपी

2
यह उत्तर कोणीय डॉक्टर की परिभाषा से बेहतर है। बहुत साफ़।
शामेरा अनुरंगा

2
बहुत अच्छी तरह से समझाया, बहुत बहुत धन्यवाद!
जकी मोहम्मद

जब यह खाली होता है, तो इसके बारे में क्या @Injectable()?
बेन टालियाडोरस

13

provideIn कोणीय बताता है कि रूट इंजेक्टर आपकी सेवा का एक उदाहरण बनाने के लिए जिम्मेदार है। इस तरह से प्रदान की जाने वाली सेवाएं स्वचालित रूप से पूरे एप्लिकेशन को उपलब्ध कराई जाती हैं और उन्हें किसी भी मॉड्यूल में सूचीबद्ध होने की आवश्यकता नहीं होती है।

सेवा वर्ग अपने स्वयं के प्रदाताओं के रूप में कार्य कर सकते हैं यही कारण है कि उन्हें @Injectable डेकोरेटर में परिभाषित करना आपके लिए आवश्यक सभी पंजीकरण है।


4

के अनुसार Documentation:

प्रदाता को @Injectable () मेटाडेटा में पंजीकृत करने से यह भी उपयोग नहीं होने पर संकलित ऐप से सेवा को हटाकर कोणीय को एक ऐप का अनुकूलन करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.