2016-03-03 16 views
6

Bağımlılığımın bağımlılıklarını kendisiyle birlikte dışa aktarmak için bir multi-provider kullanmak üzereyim, böylece bir bileşene aynı anda enjekte edilebilirler. bir bileşeniDeğişkenlik bağımlılıklarını dışa aktarmak için açısal 2 çoklu sağlayıcı

import {Component} from 'angular2/core'; 
import { FOO_PROVIDERS } from './foo'; 

@Component({ 
    selector: 'app', 
    providers: [FOO_PROVIDERS] 
}) 
export class App {} 

için

following

import {Inject, Injectable, provide} from 'angular2/core'; 
import {Http, HTTP_PROVIDERS} from 'angular2/http'; 

export class Foo { 
    constructor(@Inject(Http) http) {} 
} 

export const FOO_PROVIDERS = [ 
    provide(Foo, { useClass: Foo, multi: true }), 
    provide(Foo, { useValue: HTTP_PROVIDERS, multi: true }) 
]; 

Http yok sağlayıcı neden olacaktır! (Uygulama -> Foo -> HTTP) Onları benzer işi yapmak beklenirken

Ve

import {Inject, provide} from 'angular2/core'; 
import {Http, HTTP_PROVIDERS} from 'angular2/http'; 

class Foo { 
    constructor(@Inject(Http) http) {} 
} 

export const FOO_PROVIDERS = [Foo, HTTP_PROVIDERS]; 

this, iyi çalışır.

Bu durumda çoklu sağlayıcı için uygun bir kullanım var mı?

+0

eşdeğerdir hangi (eğer (değil useValue olarak) sağlayıcılara doğrudan HTTP_PROVIDERS eklerken yapılır, hangi Http kaydetmeniz gerekir Bir not olarak: Ben bir tane-FOO_PROVIDERS koymak için FOO_PROVIDERS koymak için önce FOO değil, daha önce – Tucker

+0

@Tucker Bu doğru, sınıflar çekilir değil. – estus

cevap

3

Eğer multi: true ile

constructor(foo:Foo) 

Eğer

export const FOO_PROVIDERS = [ 
    provide(Foo, { useClass: Foo, multi: true }), 
    provide(Foo, { useValue: HTTP_PROVIDERS, multi: true }) 
]; 

ve

ile Foo

constructor(foo:any) 

olarak tescil bütün sağlayıcıları geçmiş olsun daha size provide(Foo, ...), kayıt

constructor(@Inject(Foo) foo:Foo[]) 
Eğer foo için Foo bir örneğini ve bir şekilde 2 öğeyi sağlayıcıların listesine (bu HTTP_PROVIDERS bulunan)

güncelleme

Belki de farklı beklentileri vardır içeren bir dizi geçirilmesi alacağı

ne olması gerektiği. @Inject(Http) http'un burada nasıl olduğunu göremiyorum. HTTP_PROVIDERS yalnızca Foo için değer olarak kaydedilir. Sağlayıcılar çözümlendiğinde, useValue'a hangi değeri geçersiniz. DI Foo için sağlayıcıları arar ve atanan değeri geçti ve bu değerin ne olduğuyla ilgilenmiyor. Numaranızda Http için bir sağlayıcı bulunmamaktadır, bu nedenle Foo'un kendisi Http enjekte edilememiştir.HTTP_PROVIDERSHttp içerdiğinden provide(Http, {useClass: Http})

Update2

// An injected service that itself needs to get passed in a dependency 
@Injectable() 
class Foo { 
    constructor(private http:Http); 
} 

// container for a bunch of dependencies  
@Injectable() 
class MyProviders { 
    // add everything you want to make available in your components 
    constructor(public foo:Foo, public bar:Bar, ...); 
} 

class MyComponent { 
    // inject just MyProviders and use the dependencies it provides 
    constructor(private providers: MyProviders) { 
    // access provided values 
    providers.foo.doSomething(); 
    providers.bar.doSomethingElse(); 
    } 
} 

// Add all providers to allow DI to resolve all above dependencies 
bootstrap(AppComponent, [HTTP_PROVIDERS, Foo, Bar]); 

}

+0

Ne yazık ki bunu doğrulayamıyorum. [Bu] (http://plnkr.co/edit/XyBBUNb6smvq3ieH4fp1?p=preview) ve [this] (http://plnkr.co/edit/nerxCcdwoju6MBplPXhI?p=preview), Foo örneğinin enjekte edilmesiyle sonuçlanır constructor (@Inject (Foo) foo) '), tek fark, çoklu sağlayıcı durumunda Http'nin çözülememesidir. Ve kurucu (foo: Foo []) 'yapmak 'Array için sağlayıcı yok! (App -> Array) '. – estus

+0

Bu, "Foo" yerine "FOO_PROVIDERS" yerine "Uygulamanın sağlayıcılarına" eklerseniz ilk Plunker'ınızda iyi çalışır. Http://plnkr.co/edit/mxet3Knfirnsf2jA0XGu?p=preview –

+0

Aslında, fark etmez 'Inject (Http) http', kasıtlı olarak" foo "nun bir dizi değil, Foo örneğinin olduğundan emin olmak için yorumda bulundu. Şartsız bağımlılık ile (ilk örnekte (http://plnkr.co/edit/rNRalQnnkAPcTItmguW3?p=preview) sorudaki) açıklanan problem aynıdır. Bu yüzden, burada çoklu sağlayıcı kullanımıyla ilgili sorunun ne olduğu ve sorunun bu durum için nasıl geçerli olduğu belirsizdir. – estus