Was ist eine Kompositionswurzel im Kontext der Abhängigkeitsinjektion?

73

Ich erforsche die Abhängigkeitsinjektion und der Begriff Kompositionswurzel wird überall verwendet. Also, was ist es?

Thomas
quelle

Antworten:

72

Die Kompositionswurzel ist die einzige Stelle in Ihrer Anwendung, an der die Komposition der Objektdiagramme für Ihre Anwendung unter Verwendung des Abhängigkeitsinjektionscontainers erfolgt (obwohl dies irrelevant ist, kann es sich um einen Container handeln oder manuell mit pure DI ).

Es sollte nur einen Ort geben, an dem dies geschieht, und Ihr Container sollte nicht außerhalb der Kompositionswurzel verwendet werden müssen.

Zitat aus einer der unten verlinkten Antworten:

In der Praxis bedeutet dies, dass Sie den Container im Stammverzeichnis Ihrer Anwendung konfigurieren sollten.

  • In einer Desktop-App wäre dies die Hauptmethode (oder sehr nahe daran).
  • In einer ASP.NET-Anwendung (einschließlich MVC) befindet sich dies in Global.asax
  • In WCF wäre das in einer ServiceHostFactory
  • etc.

Hier gibt es eine gute Antwort , die etwas mehr darüber erklärt.

Siehe auch diese Antwort .

Sam Holder
quelle
Was ist mit Webanwendungen wie PHP-Frameworks? Sollte die Kompositionswurzel index.php sein?
CMCDragonkai
@CMCDragonkai, obwohl ich keine Erfahrung mit PHP habe, index.phpklingt nicht nach einem guten Ort, um es zu haben.
Oscar Mederos
Oder so etwas wie bootstrap.php, das in index.php gespeichert ist.
CMCDragonkai
@CMCDragonkai, mit PHP MVC-Frameworks verwende ich normalerweise ein Bootstrap-Include als Ort zum Einrichten der Abhängigkeiten. Wenn Sie jedoch keinen DI-Container verwenden (wenn Sie die Verkabelung manuell durchführen), kann es hilfreich sein, dies an einer anderen Stelle zu tun, wenn Sie bereits wissen, welcher Controller verwendet wird, sodass Sie nur die zugehörigen Objekte einrichten, da Sie sonst möglicherweise viel instanziieren von Objekten, die nicht verwendet werden. Dies ist kein Problem bei DI-Containern, die das verzögerte Laden unterstützen, und kein Problem bei kleinen Anwendungen (bei sehr kleinen Apps ist index.php möglicherweise ein guter Ort). Denken Sie daran, nur eine CR zu haben.
MV.
Gute Erklärung, danke, aber was ist, wenn der injizierte Service geändert wird (z. B. an einem Ort neu initialisiert), wie kann sichergestellt werden, dass er in allen Kundenartikeln auf dem neuesten Stand ist, für die ein geänderter injizierter Service auf dem neuesten Stand sein muss?
Lukasask
4

Mark Seemann hat einen großartigen Artikel über das Entwurfsmuster von Composition Root geschrieben.

Wesentliche Punkte aus diesem Artikel sind:

Ein Kompositionsstamm ist ein (vorzugsweise) eindeutiger Ort in einer Anwendung, an dem Module zusammengesetzt werden.

Nur Anwendungen sollten Composition Roots haben. Bibliotheken und Frameworks sollten nicht.

Ein DI-Container sollte nur vom Composition Root aus referenziert werden. Alle anderen Module sollten keinen Verweis auf den Container haben.

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

Unter Berücksichtigung dieser Prinzipien habe ich mein eigenes JavaScript Dependency Injection Framework namens Di-Ninja geschrieben

https://github.com/di-ninja/di-ninja

Wie ich weiß, ist es das einzige in Javascript, das das Composition-Root-Entwurfsmuster implementiert, und seine Dokumentation könnte ein weiteres gutes Beispiel sein, um zu demonstrieren, wie es funktioniert.

Es funktioniert mit NodeJS, Browser (mit Webpack oder UMD / AMD) und React-Native.

DevTheJo
quelle