2016-08-06 18 views
5

Bir fabrika sağlayıcısını kullanmam gereken bir durum düşünemiyorum. resmi dokümanlar https://angular.io/docs/ts/latest/guide/dependency-injection.html durum göre Angular 2 fabrika işlevleri ne zaman kullanılmalıdır?

edilmiştir (bir ( hizmet-a) başka bir hizmet içinden bir servis ( hizmet-b) erişmek mümkün olmayabilir, ancak, fabrika işlevi yapmasıdır service-b'ye () erişim. Peki, böyle bir şey ne zaman gerçekleşir? Angulars DI MyService örneğini eğer

+0

Bağlantılı belgede bahsettiğiniz metni nereden bulabilirim? "Bir hizmet (hizmet-b), başka bir hizmetin içinden (hizmet-a) erişemeyebilir, ancak, fabrika işlevi" –

+0

yapar. Bu, belgelerin yorumlanmasıydı, https: // açısal olarak .io/docs/ts/latest/guide/dependency-injection.html #! # Enjektör-sağlayıcıları bölümünün hemen altındaki "Fabrika sağlayıcıları" bölümünden "Neden? Biz de bilmiyoruz. Bunun gibi şeyler olur." – johncol

cevap

6

sadece sınıf

providers: [MyService] 

Bu yalnızca eserlerini geçirerek sağlayıcısı kayıt olabilirsiniz.

örneğin

@Injectable() 
class MyService { 
    constructor(private http: Http, private String configVal) {} 
} 

sonra DI olduğunu değilString sağlayıcı için geçerli bir anahtar (ilkel türleri sağlayıcı anahtar olarak çalışmaz olmadığı için bir örneğini oluşturmak mümkün.

için varsa Bunu gerekirse

Eğer tam nasıl yeni bir ins kontrol

providers: [ 
    { 
     provide: MyService, 
     useFactory: (http) => { 
     return new MyService(http, 'http://mydbserver.com:12345'); 
     }, 
     deps: [Http] 
    } 
] 

Bu şekilde böyle bir fabrika işlevini kullanabilirsiniz Tance oluşturuldu ve Angulars DI sadece fabrika işlevini Http örneğiyle çağırması gerektiğini bilmelidir.

+0

Bunu anlıyorum, ancak, ör. Birisi, size bu yapılandırma değerlerini veren ve MyService'ye enjekte eden bir hizmet olan MyConfigService'i oluşturabilir. Bu yüzden, sağlayıcıları bu şekilde tanımlamamıza izin veren açısal çerçevenin başka bir nedeni olup olmadığını merak ediyorum. Neyse, cevabınız için teşekkürler! – johncol

+1

Örneğin, Injectable() 'dekoratörüne sahip olmayan sınıfları enjekte etmek istiyorsanız ve kaynağa sahip olmadığınız için ekleyemezsiniz. Eminim başkaları da vardır. –

İlgili konular