8

पूर्व:कोणीय 2 घटक में सशर्त इंजेक्षन सेवा

2 सेवाओं

1) one.service.ts

2) two.service.ts

है और मेरे पास एक घटक है - dashboard.component.ts

import { Component, ViewEncapsulation, Inject } from '@angular/core'; 
import { OneService } from '../services/one.service'; 
import { TwoService } from '../services/two.service'; 

@Component({ 
    selector: 'dashboard', 
    encapsulation: ViewEncapsulation.Emulated, 
    styleUrls: ['./dashboard.less'], 
    templateUrl: './dashboard.html' 
}) 
export class DashboardComponent { 
    constructor() { 
     // Here how do I get service instance based on some this condition. 
     if(true) { 
      /* Service **one.service.ts** to be injected */ 
     } else { 
      /* Service **two.service.ts** to be injected */  
     } 

    } 
} 
+1

'useFactory' या' injector.get' – yurzui

+0

का उपयोग करें या शायद डैशबोर्ड कॉम्पोनेंट के विशिष्ट उदाहरण बनाएं। यह अजीब लगता है कि यह घटक दो सेवाओं का उपयोग करने के बिंदु पर polymorphic हो। मैं निश्चित रूप से गलत हो सकता हूं क्योंकि हम डोमेन संदर्भ – Sebas

+0

को याद करते हैं, इस तरह के प्रश्न को जांचें, मैंने कोणीय 2 में आईओसी के साथ सही तरीके से निपटने के लिए कहा: http://stackoverflow.com/a/42422835/1291428 – Sebas

उत्तर

8

आप Injector

import { Injector } from '@angular/core' 
... 
constructor(private injector: Injector){ 

    if(true) { 
    this.oneService = <OneService>this.injector.get(OneService); 
    } else { 
    this.twoService = <TwoService>this.injector.get(TwoService); 
    } 
} 

उपयोग कर सकते हैं @MeirionHughes उल्लेख किया है इस सेवा लोकेटर पैटर्न कहा जाता है:

तकनीक सेवा लोकेटर पैटर्न का एक उदाहरण है।

बचें इस तकनीक जब तक आप सही मायने में इसकी आवश्यकता है। यह एक लापरवाही पकड़ने-बैग दृष्टिकोण को प्रोत्साहित करता है जैसे कि आप यहां देखते हैं। व्याख्या करना, समझना और परीक्षण करना मुश्किल है। आप इस वर्ग को क्या चाहिए या यह क्या करेगा, कन्स्ट्रक्टर का निरीक्षण करके आप नहीं जान सकते। यह किसी भी पूर्वजों के घटक से ही सेवाएं प्राप्त कर सकता है, न केवल अपने ही। आपको यह पता लगाने के लिए कार्यान्वित करने के लिए मजबूर होना पड़ता है कि यह क्या करता है।

फ्रेमवर्क डेवलपर्स इस दृष्टिकोण को ले सकते हैं जब उन्हें सामान्य रूप से और गतिशील रूप से सेवाएं प्राप्त करनी होंगी।

स्रोत: https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector

और फिर के रूप में उल्लेख आप अन्य सेवा के इन इंजेक्टर मिल और फिर अपने घटक में इस सेवा इंजेक्षन कर सकते हैं।

+0

बहुत बढ़िया। यह काम करता है! – Ajey

+0

वह सेवा लोकेटर पैटर्न है; आप सेवा इंजेक्शन नहीं दे रहे हैं। दोनों सेवाओं को प्रदाता में इंजेक्शन दिया जाना चाहिए, फिर प्रदाता को घटक में इंजेक्ट करना चाहिए। –

+0

@MeirionHughes मैंने डाउनवोट – echonax

संबंधित मुद्दे