Verwendung der Abhängigkeitsinjektion mit statischen Methoden?

8

Stellen Sie sich vor, es gibt eine Klasse Customer mit einer Instanz Load() Methode.

Wenn die Methode Load() aufgerufen wird, ruft sie Bestelldetails auf, z. B.

%Vor%

GetAll() ist eine statische Methode der Klasse Order und die Eingabeparameter sind Felder, die in der Klasse Customer definiert sind.

Wie Sie sehen können, ist Order eine Abhängigkeit von der Klasse Customer , aber ich kann nicht einfach eine IOrder erstellen und sie dort einfügen, da Schnittstellen keine statischen Methoden haben können.

Daher lautet die Frage, wie ich in diesem Beispiel die Abhängigkeitsinjektion einführen könnte.

Ich möchte GetAll() nicht zu einer Instanzmethode machen, da es eine statische Methode ist und auf diese Weise beibehalten werden muss.

Ich habe beispielsweise Hilfsklassen in meinem Entwurf verwendet, von denen die meisten nur statische Methoden enthalten.

    
The Light 29.06.2011, 15:48
quelle

3 Antworten

9

Wenn Sie müssen behalten die statische Methode, würde ich die statischen Aufrufe in ein Repository-Objekt umbrechen.

So:

%Vor%

Jetzt injizieren Sie dieses Repository in Ihre Customer -Klasse.

(Ich gehe davon aus, dass Sie dies tun, damit Sie gefälschte IOrder zur Laufzeit zu Testzwecken injizieren können. Ich sollte sagen, dass statische Methoden im Allgemeinen ein ernsthaftes Hindernis beim Testen darstellen.)

    
Paul Phillips 29.06.2011, 15:57
quelle
3

Da Ihr aggregierter Stamm zum Abrufen von Aufträgen Ihr Kundenmodell ist, würde ich stark Ihnen raten, ein Kundenrepository zu erstellen und das zu injizieren, was auch immer es benötigt.

Hier ist ein Beispiel:

%Vor%     
Mike 30.06.2011 21:38
quelle
1

Funktionszeigerinjektion

TLDR:

Inject einen Funktionszeiger in die Klasse Customer . Der Wert dieses Funktionszeigers kann Order.GetAll in der Produktion und MockOrder.GetAll in Tests sein.

BEISPIEL:

Die Abhängigkeit ( problematische statische Funktion, von der wir abhängig sind ):

%Vor%

Unsere abhängige Klasse ( hängt von der statischen Funktion ab):

%Vor%

Produktionsclientklasse ( führt die Abhängigkeitsinjektion durch ):

%Vor%

Testen der Clientklasse ( wie der Komponententest eine falsche Abhängigkeit injizieren kann ):

%Vor%

DISKUSSION:

Wie Sie den "Funktionszeiger" tatsächlich injizieren, hängt von der Syntax und den Funktionen ab, die in Ihrer Sprache verfügbar sind. Hier spreche ich nur über das allgemeine Konzept.

Das ist nicht gerade eine schöne Lösung. Es wäre wahrscheinlich einfacher, wenn Sie GetAll als Instanzmethode ändern könnten (vielleicht indem Sie ein Objekt OrdersLoader einfügen oder die Antwort von Paul Phillips verwenden). Aber wenn Sie es wirklich als statische Funktion behalten wollen, dann wird diese Lösung funktionieren.

    
tboyce12 03.08.2017 01:37
quelle