2016-05-03 4 views
0

Ich habe eine Klasse, die als Modell für einige Daten dient, die ich von einem Server bekomme. Diese Daten beginnen als ein unhandliches XML-Objekt, in dem Textknoten Attribute haben, so dass das Json-Format, in das ich es umwandle, keine einfachen Zeichenfolgenwerte hat. Stattdessen habe ich:Bereitstellung neuer Instanzen der Modellklasse für die Abhängigkeitsinjektion in Angular 2

@Injectable() 
export class FooString { 
    _attr: string; 
    value: string; 
    isReadOnly(): boolean { 
    return this._attr && this._attr === 'ReadOnly'; 
    } 

    isHidden(): boolean { 
    return this._attr && this._attr === 'Hid'; 
    } 
} 

Dann ist mein Modell wie ist:

@Injectable() 
export class Payment { 
    constructor(
    public FooId: FooString, 
    public FooStat: FooString, 
    public FooName: FooString) { } 
} 

Alles endet mit der gleichen Instanz von FooString auf. Wie bekomme ich diskrete Instanzen für jeden von ihnen?

ich eine Fabrik versucht, aber es immer noch schafft nur eine einzige Instanz:

export let fooStringProvider = provide(FooString, { 
    useFactory:(): FooString => { 
    console.log('in foostring factory'); 
    return new FooString(); 
    } 
}); 

Antwort

3
new FooString(); 
new Payment(); 

;-)

Warum DI verwenden, wenn sie Abhängigkeiten nicht haben und Sie don‘ t wollen einzelne Instanzen pro Provider pflegen. Verwenden Sie daher einfach new.

Wenn DI verwenden

Es gibt ein paar Kriterien, wenn statt new das Richtige DI mit:

  • Wenn Sie Angular wollen Instanzen pflegen und mit anderen teilen
  • Wenn Sie möchten, um mit einer Schnittstelle oder Basisklasse zu arbeiten, aber dann möchten Sie von außen konfigurieren, welche Implementierung zur Laufzeit tatsächlich verwendet werden soll - wie die MockBackend für Http während des Tests.
  • Wenn Sie Klasse Abhängigkeiten Instanzen und/oder durch DI gelieferten Werte
  • Wenn Sie leicht in der Lage sein wollen, testen Klassen in Isolation (https://en.wikipedia.org/wiki/Inversion_of_control)
  • wahrscheinlich andere ...

Wenn Es gibt gute Argumente, DI zu verwenden, aber Sie möchten auch neue Instanzen, dann können Sie einfach eine Factory bereitstellen.

Diese Antwort https://stackoverflow.com/a/36046754/217408 enthält ein konkretes Beispiel, wie man das macht.

Die Verwendung von DI ist normalerweise eine gute Idee. Es gibt IMHO keine starken Argumente gegen die Verwendung von DI. Nur wenn keines der obigen Argumente zutrifft und die Bereitstellung von Factories zu umständlich ist, verwenden Sie stattdessen new Xxx().

+0

Danke. Ich werde das machen. Ich verstehe nicht, wann ich 'new' verwenden soll und wann ich Angulars DI benutzen soll. Kannst du mich aufklären oder in die richtige Richtung weisen? Das Beispiel, das ich oben angegeben habe, ist eines der einfachen Objekte, aber ich habe andere, die mehrere komplexe Datenstrukturen enthalten. Die Art, in der es aussieht wie das Angular.io-Beispiel eines Autos mit einem Motor, Reifen usw. An der Oberfläche sieht es so aus, als ob DI gut dafür wäre, aber ich kann nur eine Instanz haben? – Andrew

+0

Ich habe meine Antwort aktualisiert. –

Verwandte Themen