PHP-Abhängigkeitsinjektion, wenn die Argumente für den Konstruktor nicht verfügbar sind

8

Wir fangen gerade erst an, uns gemeinsam darum zu bemühen, die Abhängigkeitsinjektion in unserem Projekt einheitlich anzuwenden, und ich bin auf ein Problem gestoßen.

Ich schreibe eine Klasse für unsere MongoDB-Abfragen. Ich übergebe einen MongoClient als eine Abhängigkeit vom Konstruktor, ohne Probleme. Aber wie gehe ich mit einer Abhängigkeit um, wenn die zum Instanziieren des Objekts erforderliche Variable zum Zeitpunkt der Instanziierung nicht verfügbar ist?

Insbesondere haben wir einen Wrapper für die MongoCollection-Methode findOne, der, wenn Sie eine Zeichenfolge übergeben, diese Zeichenfolge (im alten Code) in eine MongoId mit "new MongoId ($ _ id)" umwandelt verwendet das für die Suchfunktion.

Nach dem, was ich über die Abhängigkeitsinjektion gelernt habe, ist die Verwendung von "new MongoId" eine schlechte Idee, und ich weiß bereits, dass es schwieriger wird, Testfälle für die Funktion zu schreiben, die eine Zeichenfolge in eine MongoId konvertiert. p>

Aber wie gehe ich mit der Injektion um, wenn die MongoId-Klasse den ID-String des Konstruktors übernimmt?

Das Einzige, woran ich gedacht habe, wäre, den Klassenkonstruktor zu schließen, der etwas wie folgt macht:

%Vor%

mit

%Vor%

[bearbeitet, um diesen letzten Teil zu reparieren]

Aber ist das der richtige Weg, damit umzugehen? Natürlich, wenn wir ein DiC verwenden, können wir es schaffen, aber es ist ein bisschen zu viel, wenn wir den Konstruktor schließen müssen. Bin ich zu dogmatisch, meine Abhängigkeiten zu injizieren? Ich könnte das leicht beheben, indem ich "new MongoId ($ _ id)" in der neuen Klasse verwende, nehme ich an.

    
Karptonite 21.01.2013, 21:29
quelle

2 Antworten

2

Anstelle einer Schließung könnten Sie eine Factory verwenden:

%Vor%

In Fabriken wird es als okay angesehen, "neue Dinge" fest codierte Abhängigkeiten zu haben, da die Erstellung von Objekten ihr einziger Zweck ist und Sie diese leicht durch eine andere Factory ersetzen könnten.

Ihre Verbraucherklasse ( MyMongo ) hat jetzt eine Abhängigkeit von MongoFactory (oder ihrer Schnittstelle, wenn Sie so wollen), die Sie leicht "injizieren" können.

    
Fabian Schmengler 21.01.2013 22:14
quelle
1
  

Aber wie gehe ich mit einer Abhängigkeit um, wenn die zum Instanziieren des Objekts erforderliche Variable zum Zeitpunkt der Instanziierung nicht verfügbar ist?

PHP wird einen schwerwiegenden Fehler verursachen, bevor Sie die Möglichkeit haben, es selbst zu handhaben. Wenn Sie Typparameter verwenden und / oder diese nicht definieren, wird null PHP standardmäßig einen schwerwiegenden Fehler verursachen, wenn dieser Parameter nicht an eine Funktion übergeben wird.

  

Nach dem, was ich über die Abhängigkeitsinjektion gelernt habe, ist die Verwendung von "new MongoId" eine schlechte Idee, und ich weiß bereits, dass es schwieriger wird, Testfälle für die Funktion zu schreiben, die eine Zeichenfolge in eine MongoId konvertiert. p>

Wird es (in PHPUnit)?

%Vor%
  

Aber wie gehe ich mit der Injektion um, wenn die MongoId-Klasse den ID-String des Konstruktors übernimmt?

Weiß nicht, was du damit meinst, aber du solltest nur das Ergebnis der MongoId s Verarbeitung testen.

Das letzte Bit Ihrer Frage verliert mich ein wenig, ich denke es ist, weil es nicht wahr PHP ist (d. h. $__construct ).

Ich bin mir nicht sicher, warum Sie die Funktion so in die Klasse schieben müssen. Ich meine, was ich am meisten habe ist:

%Vor%

Sie brauchen nichts mehr, und Sie müssen den Konstruktor von MongoId nicht testen, da dieser bereits getestet wurde. Stattdessen sollten Sie Ihre öffentliche API testen, nicht die einer anderen.

    
Sammaye 21.01.2013 21:48
quelle