Создание явных зависимостей при использовании контейнера внедрения зависимостей - PullRequest
2 голосов
/ 18 марта 2012

Одной из замечательных особенностей внедрения зависимостей является то, что зависимости класса явно определены в его интерфейсе (то есть в конструкторе).Однако, если используется контейнер внедрения зависимостей, многие из этих зависимостей объединяются в одну зависимость (контейнер).Следовательно, многие истинные зависимости класса скрыты за контейнером.Как этого избежать, чтобы зависимости все еще были четко определены при использовании контейнера ввода зависимостей?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2012

Да и нет, это действительно зависит от того, как работает ваш контейнер внедрения зависимостей.

Я не вижу никаких проблем с этим видом кода:

class Class1 {
    /**
     * @Inject
     * @var Class2
     */
    private $class2;
}

Даже если зависимостьбудет введен контейнером, тот факт, что Class1 зависит от Class2, является довольно явным.(здесь используется контейнер для ввода зависимостей PHP-DI )

0 голосов
/ 09 октября 2014

Я задал этот вопрос 3 года назад и с тех пор начал понимать и любить ДИ в статически типизированных языках.

Похоже, что когда я задал этот вопрос, я не понял разницу между «Service Locator» и «Dependency Injection Container» (DIC).

DIC работает «под» приложением и отвечает за построение объектов и построение графа объектов, как правило, во время начальной загрузки, но до приложения, если оно полностью загружено. Классы не должны знать о DIC и не должны зависеть от него. DIC должен создавать все зависимости класса и внедрять их, как если бы класс создавался вручную.

Сервисный локатор - это объект, который передается по системе и используется для поиска зависимостей. Использование локатора сервиса скрывает зависимости (первоначальная проблема, которую я заметил, когда изучал этот материал) и создает общесистемную зависимость (то есть сам локатор службы).

Как правило, я бы избегал шаблона поиска сервисов (некоторые называют его «анти-шаблоном»). Использование хорошего DIC, такого как DIC от Ninject или Symfony 2, позволит вашим классам сосредоточиться на бизнес-логике, а не на поиске зависимостей.

Прочтите статью Мартина Фаулерса о внедрении зависимости: http://www.martinfowler.com/articles/injection.html

0 голосов
/ 18 марта 2012

Кажется, что вы можете использовать атрибут зависящего от вас в своем определении бина, чтобы добавить явную зависимость в ваш код.Я нашел похожий вопрос здесь

Объявление явной зависимости объекта в Spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...