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.
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.
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.)
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.
Tags und Links dependency-injection static-methods