2016-01-03 9 views
8

मैं एक मूल Angular2 ऐप को तार करने की कोशिश कर रहा हूं जो एचटीपी सेवा का उपयोग करता है। (ट्यूटोरियल मैं एक ComponentHttp सेवा है, जो गलत लगता है, जब तक कि पतली नियंत्रकों के बुनियादी दर्शन बदल गया है उपभोग होने से यह कर देखा है में से अधिकांश - लेकिन यह एक अलग सवाल है।)क्या आप केवल बूटस्ट्रैप के माध्यम से सेवाओं में सेवाओं को इंजेक्ट कर सकते हैं?

मैं एक बनाना चाहते हैं सेवा जो कोणीय की Http सेवा का उपयोग करती है। लेकिन मैं समझ नहीं कैसे Http सेवा इस के अलावा अन्य सुई:

boot.ts:

import {bootstrap} from 'angular2/platform/browser'; 
import {AppComponent} from './app.component'; 
import {HTTP_PROVIDERS } from 'angular2/http'; 

bootstrap(AppComponent, [HTTP_PROVIDERS]); 

myService.ts:

import {Injectable} from 'angular2/core'; 
import {Http} from 'angular2/http'; 

@Injectable() 
export class aService{ 
    constructor(http:Http){ 
    } 
    /** do some stuff *// 
} 

यह काम करता है, लेकिन यह बहुत लग रहे हैं सेवा की उपयोगकर्ता को सेवा की निर्भरताओं को जानने के लिए गलत होना आवश्यक है और उन्हें बूटस्ट्रैप प्रक्रिया में इंजेक्ट करने की आवश्यकता होनी चाहिए। ऐसा लगता है कि एक providers सरणी को एक सेवा के लिए सीधे उसी तरह से हाथ में रखने का एक तरीका होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है। क्या मैं बस कुछ याद कर रहा हूँ?

+0

"जब तक पतली नियंत्रकों के मूल दर्शन में बदलाव नहीं हुआ है" - यह नहीं है। [आर्किटेक्चर अवलोकन] को उद्धृत करने के लिए (https://angular.io/docs/ts/latest/guide/architecture।एचटीएमएल) गाइड: "एक घटक का काम उपयोगकर्ता अनुभव को सक्षम करना और कुछ और नहीं करना है। यह दृश्य के बीच मध्यस्थता करता है ... और एप्लिकेशन तर्क ... यह सबकुछ सेवाओं के लिए गैर-तुच्छ प्रदान करता है।" –

+0

धन्यवाद @MarkRajcok - इस तरह मुझे लगता है कि यह किया जाना चाहिए। मेरा भ्रम इस तथ्य से आता है कि दस्तावेज नियंत्रकों को उससे भी ज्यादा कुछ दिखाता है। (उदाहरण के लिए: https://angular.io/docs/js/latest/api/http/Http-class.html) यदि घटक वास्तव में पतले होने चाहिए, तो वे शायद http से अक्सर काम नहीं करेंगे, लेकिन दस्तावेज़ों का मतलब है कि यह सामान्य है। –

+0

ठीक है, एपीआई दस्तावेज़ों में उदाहरण एक ऐप आर्किटेक्ट करने के लिए सर्वोत्तम प्रथाओं का पालन करने की संभावना नहीं है, और यह शायद उचित है। –

उत्तर

3

अद्यतन

इस तरह अगर एक माता पिता इंजेक्टर एक कार्यान्वयन OtherService लिए यह एक प्रयोग किया जाता है प्रदान करता है, अन्यथा OtherServiceImpl प्रयोग किया जाता है (डिफ़ॉल्ट)।

@Injectable() 
class SomeService { 
    OtherService _other; 

    SomeService(Injector injector) { 
    _other = injector.getOptional(OtherService); 
    if (_other == null) { 
     _other = injector.resolveAndCreateChild([ 
     provide(OtherService, useClass: OtherServiceImpl) 
     ]).get(OtherService); 
    } 
    _other.doSomething(); 
    } 
} 

प्रदान की जाती है की तरह

bootstrap(AppElement, [ 
    provide(OtherService, useClass: OtherServiceImpl2) 
]); 

OtherServiceImpl2 एक और एक प्रयोग किया जाता है।

भी https://github.com/angular/angular/issues/5622

मूल

देखें तुम बस (@Optional() एनोटेशन का प्रयोग करके) http सेवा वैकल्पिक बना सकता है और यदि कुछ भी प्रदान कर रहा है सिर्फ new Http() साथ निर्माता के अंदर एक उदाहरण बना सकते हैं। इस प्रकार उपयोगकर्ता को 0 निर्भरता के बारे में जानने के लिए की आवश्यकता नहीं है, लेकिन यदि आवश्यक हो तो वैकल्पिक कार्यान्वयन पास करने में सक्षम है (उदाहरण के लिए परीक्षण के लिए)। यदि सेवा के अंदर निर्भरता बनाने के लिए DI की आवश्यकता होती है, तो आप एक इंजेक्टर इंजेक्ट कर सकते हैं और निर्भरताओं को प्राप्त करने के लिए इसका उपयोग कर सकते हैं। http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

में भी वैकल्पिक निर्भरता देख रहे हैं वही भी काम कर सकता है (अपने आप को अभी तक की कोशिश की नहीं) है सिर्फ एक बच्चे इंजेक्टर बना सकते हैं और यह स्वयं को छोड़

SkipSelfMetadata प्रलेखन

class Dependency { 
    } 

    @Injectable() 
    class NeedsDependency { 
    dependency; 
    constructor(@SkipSelf() dependency:Dependency) { 
     this.dependency = dependency; 
    } 
    } 

    var parent = Injector.resolveAndCreate([Dependency]); 
    var child = parent.resolveAndCreateChild([NeedsDependency]); 
    expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true); 

    var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]); 
    expect(() => inj.get(NeedsDependency)).toThrowError(); 
से निर्देश देने के लिए

मुझे अभी तक पता नहीं है कि अगर यह अभी भी अनुरोधित प्रकार प्रदान नहीं कर सकता है तो यह अभी भी "स्वयं" से हल हो जाता है।

+0

मैंने सोचा कि निर्भरता बनाने के लिए खुद को 'नया' कहकर बुलाया गया है। –

+0

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

+0

इतनी आसानी से पढ़ने के लिए धन्यवाद! –

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