2015-02-11 9 views
14

Ich schreibe gerade mein eigenes MVC-Framework für Lernzwecke und ich entschied mich, einen Dependency-Injection-Container zu verwenden, um gemeinsam genutzte Objekte zwischen Klassen zu teilen (zum Beispiel DB-Instanz).Soll ich Dependency Injection Container (DIC) als Parameter in MVC übergeben?

Ich initialisiert den Container in meiner Bootstrap-Datei und ich habe eine Instanz davon in meiner Application Klasse, ist es eine gute Praxis, eine Instanz des Containers während des Routing-Prozesses übergeben? (d. h. Übergabe des Containerobjekts als Parameter in ControllerBase Konstruktor). Ist es auch eine gute Übung, den Container als einen Parameter im Konstruktor meiner ModelBase zu akzeptieren?

+7

Nein, was Sie tun (die Übergabe der gesamten Sache) wird Service-Locator genannt und ist ein Anti-Muster. – PeeHaa

+0

Der Container sollte nie herumgereicht werden, und wenn es fertig ist, sollte es nur ein lazy-loading-Detail sein. Um dies zu verdeutlichen, sollten Sie niemals etwas in Bezug auf den Container schreiben müssen, wenn Sie eine der an Ihrer MVC-Einrichtung beteiligten Klassen testen, unabhängig davon, ob Sie sich darüber lustig machen oder nicht. – Ocramius

+1

Ich habe eine Antwort über die Verwendung von Globals geschrieben, die viele der gleichen Probleme wie ein Service-Locator vor einer Weile hat. Obwohl es keine exakte Antwort auf Ihre Frage ist, ist es eine Lektüre wert und sicherlich relevant für Ihre Frage http://stackoverflow.com/questions/11923272/use-global-variables-in-a-class/11923384#11923384 – PeeHaa

Antwort

1

Es klingt wie ein Dependency Injector ist etwas anderes als das, was Sie tun. Es klingt eher wie ein ServiceLocator, ein Repository oder was auch immer. Normalerweise befindet sich der Abhängigkeitsinjektor zwischen dem Aufruf (wenn Sie ihn für die Parameterinjektion verwenden) oder zwischen der Erstellung (wenn Sie ihn für die Feld- oder Konstruktorinjektion verwenden).

Die Verwendung des Dependency Injectors muss für den Code/das Objekt, in das injiziert wird, vollständig transparent sein. Wenn Sie also eine Referenz übergeben, tun Sie etwas falsch.

Auch der DependencyInjector gehört zu der Umgebung, in der der Code ausgeführt wird. Sieh es so wie es ist. Der Abhängigkeitsinjektor sollte der Anwendung nicht einmal bekannt sein, es sei denn, Sie verwenden die Anwendung als das verwendete Framework.

So erhalten Sie Abhängigkeitsinjektion zu arbeiten bedeutet keine Referenz auf den Injektor innerhalb der tatsächlichen Anwendung. Das Ziel besteht darin, die Anwendung in beide Richtungen mit oder ohne Injektion auszuführen. Zeitraum.