2016-08-23 20 views
7

मैं वर्तमान में कोणीय 2 में डि की खुदाई कर रहा हूँ मैं इस तरह ठोस डेटाटाइप के लिए एक सामान्य उपप्रकार का उपयोग कर किसी REST- क्लाइंट को लागू कर रहा हूँ बाहर:कोणीय 2 इंजेक्षन निर्भरता निर्माता

class RESTClient<T>{ 
    constructor() { 
     var inj = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]); 
     this.http = inj.get(Http); 
     this.conf = RESTConfiguration; 
    } 
} 
class BookClient extends RESTClient<Book>{  
    constructor(){ 
     // since I dont want to inject the HTTP Providers here, I'm using a custom injector in the super class 
     super(); 
    } 
} 

class WriterClient extends RESTClient<Writer>{  
    ... 
    ... 
} 

तो जैसा कि मैं समझता हूँ, वहाँ सुपरक्लास रीस्ट-सर्विस द्वारा इंजेक्शन किए गए सभी RESTCLIents के बीच साझा की गई एक http सेवा होगी।

अब मैं इस तरह के रूप में एक RESTConfiguration वर्ग करना चाहते हैं:

@Injectable() 
export class RESTConfiguration { 
    get baseURL() { 
    return this._baseURL; 
    } 

    set baseURL(value) { 
     alert("sets value to"+value); 
     this._baseURL = value; 
    } 

    private _baseURL; 

} 

यह इस तरह के रूप मुख्य अनुप्रयोग में कॉन्फ़िगर किया जाना चाहिए:

initializeApp(){ 
    this.restconf.baseURL = "http://localhost:3004/"; 
} 
bootstrap(MyApp, [RESTConfiguration]).then(); 

मैं अब सोच रहा हूँ कि कैसे एक सिंगलटन सुई पुनर्नवीनीकरण कक्षा में मेरे RESTConfiguration का उदाहरण कन्स्ट्रक्टर को पास किए बिना, जिसे मैं कोड डुप्लिकेशंस को कम करने और टाइपस्क्रिप्ट में जेनेरिक के साथ समस्याओं से बचने के लिए तर्क-कम रहना चाहता हूं।

उपर्युक्त उदाहरण (पहला कोड स्निपेट) में मैं प्रतिबिंबित इंजेक्टर I का उपयोग करके अपनी कॉन्फ़िगरेशन इंजेक्ट करने का प्रयास कर रहा हूं जो मुझे मेरे कॉन्फ़िगरेशन का एक कस्टम उदाहरण प्रदान करता है।

मैं कई समाधान के बारे में सोचा:

  1. एक उपलब्ध बनाने एक सेवा या कुछ स्थिर वर्ग संपत्ति

  2. में अतिरिक्त सिंगलटन-तर्क को लागू करने का उपयोग करके "वैश्विक इंजेक्टर" Apps की एक्सेस हो रही मेरी कॉन्फ़िगरेशन

  3. कन्स्ट्रक्टर के बाहर कोणीय-देशी इंजेक्शन विधि का उपयोग करने का कोई तरीका ढूंढ रहा है?

क्या मेरी सोच में कोई गलती है या क्या मैं डी ढांचे का दुरुपयोग कर रहा हूं?

+0

http://stackoverflow.com/questions/39038791/inheritance-and- निर्भरता- इंजेक्शन/39038814 की एक डुप्ली की तरह दिखता है?noredirect = 1 # comment65548939_39038814 –

+0

ऊपर दिए गए लिंक को पढ़ने के बाद मैं लेखक को बहुत अधिक महसूस करता हूं - मैं वैश्विक इंजेक्टर को पारित करने के लिए कक्षाओं के लिए अपने "गंदे हैक" का उपयोग करने के लिए इच्छुक हूं - मैं निश्चित रूप से कोड को डुप्लिकेट नहीं करना चाहता हूं ~ 20-30 कक्षाएं इस के आसपास पाने के लिए कोई रास्ता? उपरोक्त दिखाए गए कस्टम इंजेक्टर के साथ क्या तरीका है? मैं फिर सीधे अपनी सेवा में कॉन्फ़िगरेशन संलग्न कर सकता हूं या इसे केवल एक साधारण स्थैतिक वर्ग बना सकता हूं ... – hakkurishian

+0

यह एक स्वतंत्र इंजेक्टर बनाता है। किसी भी मॉड्यूल में पंजीकृत प्रदाता और इन प्रदाताओं के लिए बनाए गए उदाहरण इस कस्टम इंजेक्टर द्वारा वापस नहीं किए जाएंगे। आप लिंक किए गए प्रश्न के उत्तर में ऐसा कर सकते हैं - अपने कोणीय 2 ऐप के इंजेक्टर को पास करने और इसके बजाय इस इंजेक्टर से सेवाओं को प्राप्त करने के लिए। –

उत्तर

7

यह इस मुद्दे के लिए एक समाधान प्रदान करना चाहिए, लेकिन किसी भी मामले में सहायता करें जहां किसी को इसे कन्स्ट्रक्टर पैरामीटर के रूप में आपूर्ति किए बिना सेवा इंजेक्ट करने की आवश्यकता है। Storing injector instance for use in components

आप अपने AppModule कक्षा में कोणीय इंजेक्टर कॉन्फ़िगर कर सकते हैं, और उसके बाद किसी अन्य वर्ग में इसका इस्तेमाल करते हैं (यदि आप किसी भी वर्ग से AppModule के सदस्यों तक पहुँच सकते हैं):

मैं एक और पोस्ट में इस सवाल का जवाब देखा।

AppModule में जोड़ें:

export class AppModule { 
    /** 
    * Allows for retrieving singletons using `AppModule.injector.get(MyService)` 
    * This is good to prevent injecting the service as constructor parameter. 
    */ 
    static injector: Injector; 
    constructor(injector: Injector) { 
     AppModule.injector = injector; 
    } 
} 

फिर अपने अन्य वर्ग में आप कर सकते हैं निम्नलिखित (इस प्रश्न के लिए Http साथ MyService डालें):

@Injectable() 
export class MyClass{ 
    private myService; 

    constructor(){ 
     this.myService = AppModule.injector.get(MyService); 
    } 
} 

इस का उपयोग कर के बराबर होगा:

constructor(private myService: MyService){} 
+0

यह काम करता है! मेरे मामले में: किसी अन्य मॉड्यूल से सेवा प्राप्त करें (आलसी नहीं) और सभी उदाहरण को हल करें! धन्यवाद आदमी। – 1antares1

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