5

Ich bin daran interessiert, Abhängigkeitsinjektion zu meinem aktuellen Projekt, das das MVC-Muster verwendet, anzuwenden.Wie vermeidet man Abhängigkeiten in ein Objekt zu injizieren, um es weiterzugeben?

Meine Controller rufen die Modelle auf und müssen daher die Abhängigkeiten in die Modelle einfügen. Zu diesem Zweck muss der Controller die Abhängigkeiten (z. B. ein Datenbankobjekt) an erster Stelle haben. Der Controller muss einige dieser Abhängigkeiten (wie das Datenbankobjekt) nicht verwenden, daher sollte diese Abhängigkeit nicht gegeben sein. Es muss jedoch diese Abhängigkeiten haben, wenn sie in die Modellobjekte injiziert werden sollen.

Wie kann ich verhindern, dass Abhängigkeiten in ein Objekt injiziert werden, nur um sie weiterzugeben? Dies ist falsch und kann dazu führen, dass viele Abhängigkeiten in ein Objekt injiziert werden.

Edit: Ich benutze PHP.

Antwort

2

Ich stimme Ihren Bedenken zu. Es ist ein Code-Geruch, um Abhängigkeiten zu dem einzigen Zweck zu nehmen, sie an andere Abhängigkeiten weiterzugeben.

Abhängig von der genauen Interaktion zwischen diesen Abhängigkeiten, haben Sie ein paar Optionen:

Wenn nur eine Instanz der Abhängigkeit benötigt wird

Wenn der Controller benötigt nur eine einzige Instanz einer Abhängigkeit , dann nimm stattdessen eine Abhängigkeit davon.

(Entschuldigung für die C# -Code)

Sie dies nicht tun:

public class MyController 
{ 
    public MyController(IDb db) 
    { 
     var dep = new MyDependency(db); 
     // Use dep or save it for later 
    } 
} 

Stattdessen können Sie dies tun:

public class MyController 
{ 
    public MyController(MyDependency dep) 
    { 
     // Use dep or save it for later 
    } 
} 

Sie möchten MyDependency prüfen hinter einer Schnittstelle selbst. Siehe auch Refactoring to Aggregate Services.

Wenn Sie mehrere Instanzen während der Controller-Lebensdauer

Manchmal jedoch erstellen müssen, müssen Sie dynamisch mehrere Instanzen erstellen. Dies ist häufig der Fall, wenn Sie einen Wert benötigen, der nur zur Laufzeit verfügbar ist, bevor Sie eine Abhängigkeit vollständig füllen können. In diesem Fall ist Abstract Factory ein excellent and universal solution.

+0

Ich verstehe nicht ganz, was Sie vorschlagen, sollte ich mit Ihrer ersten Option tun. Bündeln Sie die Abhängigkeiten zusammen und übergeben Sie sie als eine Einheit? –

+0

Das ist eine Option. Der Hauptpunkt ist jedoch, dass der Konsument die Abhängigkeit überhaupt nicht erzeugen soll, sondern sie anfordern soll, indem er sie als Konstruktorparameter benötigt. –

+0

Bündelt die Abhängigkeiten nicht zusammen und übergibt sie an den Controller so ziemlich wie sie alle einzeln übergeben? Es ist eine andere Art, es zu tun, aber Sie übergeben noch Abhängigkeiten an den Controller, den es nicht verwendet. Ich denke, ich hätte vielleicht mißverstanden, was du meintest! –

1

Ich spreche nicht von PHP-Erfahrung, aber Sie sollten in Inversion of Control (IOC) Containers suchen.

Diese question auf StackOverflow spricht über IOC Container für PHP. Für einen schnellen Überblick über einige der other benefits of IOC Containers sollten Sie diese Frage überprüfen, wahrscheinlich einer meiner Favoriten auf der Website. Überprüfen Sie die letzte Antwort;)

Wie kann ich vermeiden Abhängigkeiten injiziert in ein Objekt mit nur so, dass es sie weitergeben kann? Dies ist der Fall falsch und kann dazu führen, dass viele Abhängigkeiten in ein Objekt injiziert werden.

Die meisten Menschen wissen nicht, dass ein IOC-Container die Notwendigkeit, temporäre Abhängigkeiten zu speichern, void macht. Dies wiederum macht Ihren Code sauberer und einfacher zu folgen. Jede Klasse (oder jedes Modul) Ihres Codes fragt einfach danach, was sie benötigt. IOC-Container können die Objektlebensdauer verwalten. Selbst wenn zwei Klassen unabhängig voneinander nach derselben Abhängigkeit fragen, können sie dieselbe Instanz erhalten, die ziemlich ordentlich ist.

Verwandte Themen