2016-04-08 13 views
4

Neyin kullanılmasının uygun olduğu konusunda biraz kafam karıştı.Köşeli 2 DI, sağlayıcı veya saf almayı ne zaman kullanmalı?

1., statik fonksiyonları ile sadece ithal ve kullanımı ithal adını sınıfını tanımlamak ve sonra da işlev

Ortak sınıfı:

export class SomeClass { 
    static someFunction(){ 
     ... 
    } 
} 

Sınıf ihraç kullanır sınıfı:

import { SomeClass } from './someclassstatic' 
... 
constructor(){ 
    SomeClass.someFunction() 
} 

2. Tanımla tandard sınıfı, daha sonra DI yoluyla monte

Ortak sınıfı: ön yükleme yaparken

import { SomeClassDI } from './someclassdi' 
... 
constructor(private theclassdi:SomeClassDI){ 
    this.theclassdi.someFunction() 
} 

3. Daha sonra, standart sınıf tanımlayın sağlayıcısı olarak monte: Dışa sınıfını kullanır

export class SomeClassDI { 
    public someFunctionDI(){ 
     ... 
    } 
} 

Sınıf

Shared c lass:

??? I am not sure what can be the example here. 

sağlayıcılarının doğru kullanımı nedir: sınıf ihraç kullanır Angular2

import { SomeClassBS } from './someclassbs' 
... 
bootstrap(AppComponent, [SomeClassBS]); 

Class özyüklenirler

export class SomeClassBS { 
    public someFunctionBS(){ 
     ... 
    } 
} 

Sınıf?

cevap

4

Bu ilginç bir soru. kısaca cevap arıyorsanız kodunuzda sunulan gibi yapacak, tüm G tavsiye Öncelikle, ... Teşekkür

1.

bu yazıyı Dependency Injection in Angular 2

okumak Ama üzere Class örneğini oluşturmamanız, ancak yalnızca kurucudan işlevi çağırmaya çalıştığınız için bir Hata alırsınız. Bu kodu yeniden yazabilir ve işe yarayacaktır, ancak Angular2 kod stili en iyi uygulamalarını takip etmek istiyorsanız bu mükemmel bir çözüm değildir.

import { SomeClass } from './someclassstatic' 
... 
constructor(){ 
    let someClass = new SomeClass(); 
    someClass.someFunction() 
} 

Sadece çalışan kod örneğini yapmak için

2.

Ben Angular2 size Hata dönecektir inanıyoruz (Bu kodu kullanmamalısınız). Çünkü DI modeli kullanmıyorsunuz, sadece enjeksiyon sınıfı kullanmıyorsunuz ama asla kaydetmiyorsunuz.Böyle bir şey alacak:

EXCEPTION: No provider for SomeClass! (AppComponent -> SomeClass)

Yani, muhtemelen siz de yazma kod stilinden kullanmamalısınız.

3. Son olarak en iyi yolu uygulamanızda, DI desen kullanmaktır. Bu bileşende yalnızca bir kez service kullanacaksanız, bileşen ek açıklama providers özelliğine ekleyebilirsiniz.

@Component({ 
    selector: 'my-app', 
    templateUrl: 'app/app.partial.html', 
    providers: [SomeClass] 
}) 
export class AppComponent { 
    constructor(private someClass: SomeClass) { 
     this.someClass.someFunction(); 
    } 
} 

Birden farklı bileşenler içinde service kullanacağız eğer, olabildiğince az önce uygulamanın Bootstrap faz üzerinde inject onu ve providers kullanarak her bileşende kaydetmek zorunda kalmayacak, sadece örnek numarası 2'de olduğu gibi kurucuya enjekte etmeli ve bir Hata olmayacaktır.

Size yardımcı olacaktır umarım!

+0

@Teddy, tüm sorunuzu karşılıyor mu? – Mikki

+0

Açısal 2 enjeksiyon mekanizmasının benim için garip geldiğini söylemeliyim. Zaten enjekte edilen sınıfı ithal etmem gerekiyorsa bu DI'in amacı nedir? DI imkânsızlıktan soyutlama olanağı versin mi? – Joe