Что такое корень композиции в контексте внедрения зависимостей
Я изучаю внедрение зависимостей, и термин " корень композиции" используется повсеместно. Так что же это?
2 ответа
Корень композиции - это единственное место в вашем приложении, где осуществляется компоновка графов объектов для вашего приложения с использованием контейнера внедрения зависимостей (хотя то, как это сделано, не имеет значения, это может быть использование контейнера или это может быть сделано вручную с использованием чистого DI).
Там должно быть только одно место, где это происходит, и ваш контейнер не должен использоваться за пределами корня композиции.
Цитата из одного из ответов, связанных с ниже:
На практике это означает, что вы должны настроить контейнер в корне вашего приложения.
- В настольном приложении это будет в методе Main (или очень близко к нему)
- В приложении ASP.NET (включая MVC) это будет в Global.asax
- В WCF это будет в ServiceHostFactory
- и т.п.
Здесь есть хороший ответ, который объясняет немного больше об этом.
Смотрите также этот ответ.
Марк Симанн написал отличную статью о шаблоне Composition Root.
Основные пункты этой статьи:
Корень композиции - это (предпочтительно) уникальное место в приложении, где модули составляются вместе.
Только приложения должны иметь корни композиции. Библиотеки и фреймворки не должны.
На DI-контейнер следует ссылаться только из корня композиции. Все остальные модули не должны иметь ссылки на контейнер.
http://blog.ploeh.dk/2011/07/28/CompositionRoot/
Я написал свою собственную среду внедрения зависимостей JavaScript под названием Di-Ninja с учетом этих принципов.
https://github.com/di-ninja/di-ninja
Как я знаю, это единственный в javascript, который реализует шаблон проектирования Composition-Root, и его документация может быть еще одним хорошим примером, чтобы продемонстрировать, как он работает.
Он работает с NodeJS, браузером (с Webpack или UMD/AMD) и React-Native.