Ich erforsche die Abhängigkeitsinjektion und der Begriff Kompositionswurzel wird überall verwendet. Also, was ist es?
Antworten:
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 .
index.php
klingt nicht nach einem guten Ort, um es zu haben.
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.