2016-04-08 5 views
4

Ich bin ein wenig verwirrt, wenn es richtig ist, was zu verwenden.Angular 2 Wann DI, Provider oder reiner Import zu verwenden?

1. Definieren Klasse mit statischen Funktionen, einfach importieren und importierten Namen verwenden und dann funktionieren

Gemeinschafts-Klasse:

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

Klasse, die exportiert Klasse verwendet:

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

2. Definieren Sie s tandard Klasse montieren dann über DI

Gemeinschafts-Klasse:

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

Klasse, die exportiert Klasse verwendet:

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

3. Definieren der Standardklasse, montieren als Anbieter während bootstraping

Gemeinsame c Mädchen:

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

Klasse, die Angular2

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

Klasse Schopf aus dem Sumpf, die Klasse exportiert verwendet:

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

Was ist die richtige Verwendung der Anbieter?

Antwort

4

Das ist eine interessante Frage. Vor allem ich Rat Sie diesen Artikel lesen Dependency Injection in Angular 2

Aber wenn Sie für kurze Antwort suchen ...

1.

Wenn Sie sich wie in Ihrem Code präsentiert tun, Sie Es wird ein Fehler angezeigt, weil Sie keine Instanz von Class erstellen, sondern nur versuchen, die Funktion vom Konstruktor aus aufzurufen. Sie können diesen Code neu schreiben, und es wird funktionieren, aber es ist keine großartige Lösung, wenn Sie die Best Practices von Angular2-Codestil befolgen möchten.

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

Nur um Beispiel-Code arbeiten (Sie sollten diesen Code nicht verwenden)

2.

Ich glaube, dass Angular2 Sie Fehler zurück. Weil Sie kein DI-Muster verwenden, nur eine Injektionsklasse, aber registrieren Sie sie nie.Sie werden so etwas wie dieses:

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

Also, wahrscheinlich sollten Sie nicht zu dieser Art des Schreibens Code verwenden.

3.

Schließlich ist der beste Weg DI Muster zu verwenden, in Ihrer Anwendung. Wenn Sie Ihre service nur einmal in dieser Komponente verwenden möchten, können Sie sie einfach in die Eigenschaft providers der Komponentenannotation einfügen.

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

Und wenn Sie Ihre service in den mehreren unterschiedlichen Komponenten verwenden wollen, können Sie einfach inject es auf der Bootstrap Phase der Anwendung, und Sie werden es nicht in der providers mit jeder Komponente registrieren müssen, Sie wird nur benötigt, um es in den Konstruktor wie im Beispiel Nummer 2 zu injizieren, und es wird kein Fehler auftreten.

Ich hoffe, es wird Ihnen helfen!

+0

@Teddy, deckt es alle Ihre Frage? – Mikki

+0

Ich muss sagen, Angular 2 Injektionen Mechanismus fühlt sich komisch für mich. Was ist der Sinn dieser DI, wenn ich die injizierte Klasse trotzdem importieren muss? Sollte ich mir nicht die Möglichkeit geben, von der Implementation zu abstrahieren? – Joe

Verwandte Themen