2016-04-04 11 views
5

मेरे पास दो सेवाएं हैं: ऑथ सर्विस और मोनबैंकेट सेवा, और ऑथ सेवा सेवा MyService पर निर्भर करती है।कोणीय 2 किसी अन्य सेवा में इंजेक्ट सेवा 2 उदाहरण बनाता है

AuthService.ts:: यहाँ इन 2 सेवाओं के बुनियादी कोड है

import {Inject, Injectable} from 'angular2/core'; 
import {MonBanquetService} from '../monbanquet.service' 

@Injectable() 
export class AuthService { 

    public username: string; 

    constructor(protected _monBanquetService: MonBanquetService) { 
     // do something() 
    } 

} 

MonBanquetService.ts

import {Injectable, Component} from 'angular2/core'; 
import {Http, Headers, Response} from 'angular2/http'; 
import {Router} from 'angular2/router'; 

@Injectable() 
export class MonBanquetService { 

    constructor(public http: Http, private _router: Router) { 
     console.log('MonBanquetServices created'); 
    } 
} 

और मैं boot.ts में प्रदाताओं के रूप में इन दोनों सेवाओं डाल:

bootstrap(AppComponent, [ 
    ROUTER_PROVIDERS, 
    provide(LocationStrategy, {useClass: HashLocationStrategy}), 
    HTTP_PROVIDERS, 
    MonBanquetService, 
    AuthService 
]); 

हालांकि, जब मैं ऐप चलाता हूं, तो मुझे दो कंसोल लॉग 'MonBanquetServices बनाया गया' दिखाई देता है। मैंने सोचा कि सेवाओं को सिंगलेट होना चाहिए, यह कैसे है कि दो उदाहरण हैं?

धन्यवाद।

+1

तो आदर्श रूप में आप केवल '' AuthService बूटस्ट्रैप निर्भरता है, जो यह आंतरिक रूप से प्राप्त करके 'MonBanquetService' के कहने पैदा करेगा अंदर जोड़ना चाहिए। –

उत्तर

0

कोणीय प्रति प्रदाता एक एकल उदाहरण बनाए रखता है। यदि आप एकाधिक स्थानों पर प्रदाता के रूप में एक प्रकार जोड़ते हैं, तो इसके परिणामस्वरूप कई उदाहरण होते हैं।

जब DI से एक कुंजी (प्रकार, टोकन) का अनुरोध किया जाता है तो यह पदानुक्रम को देखता है और इसे प्राप्त होने वाले पहले प्रदाता से उदाहरण देता है।

इसलिए यदि आप एक वैश्विक उदाहरण चाहते हैं, केवल यह

bootstrap(AppComponent, [MonBanquetService]) 

@NgModule(
    providers: [MonBanquetService], 
    .... 
) 
export class AppMpdule{} 

या प्रदाताओं की सूची में जोड़ने के रूप में के लिए कोणीय टीम ने सुझाव दिया रूट घटक

की प्रदाता सूची में कस्टम प्रदाताओं
@Component({ 
    selector: 'my-app', 
    providers: [MonBanquetService] 
}) 
class AppComponent { 
} 

0

शायद आपने अपने घटक के "प्रदाता" विशेषता में सेवा को जोड़ा है। इस मामले में, प्रत्येक घटक उदाहरण के लिए सेवा का एक उदाहरण बनाया जाएगा। और आपके आवेदन को बूटस्ट्रैप करते समय आपने जो निर्दिष्ट किया है उसे इस सेवा के लिए ध्यान में नहीं रखा जाएगा ...

यह पदानुक्रमित इंजेक्टरों के कारण होगा।

1

वास्तव में यह नहीं करना चाहिए: अधिक जानकारी के फोर, तो आप इस सवाल पर एक नज़र हो सकता था। आपको यह सुनिश्चित करना होगा कि आप providers मेटाडाटा @Component सजावट में उपयोग न करें।

यहाँ पर देखो

लागू करने के लिए आप क्या पता चला है और काम करने की उम्मीद के रूप में की कोशिश की,

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