Внедрение зависимости: нужно ли вводить все или использовать сервисный локатор для некоторых объектов? - PullRequest
9 голосов
/ 15 марта 2012

В настоящее время я реорганизую свою библиотеку PHP на основе Zend Framework с использования локатора служб для (конструктора) внедрения зависимостей (DI).Я чувствую, что это значительно улучшает мой код, но я не уверен, должен ли я внедрять все зависимости.Локатор службы кажется более простым для зависимостей, которые часто используются и не являются специфичными.У меня есть следующие зависимости, к которым я все еще обращаюсь с помощью локатора службы:

  1. Объект Zend_Translate (мне нужно переводить сообщения везде).
  2. Объект Zend_Locale (сохраняет текущий язык)
  3. Объект Zend_Config (многое можно настроить с помощью ini-файла)
  4. Экземпляры служебных классов (для манипулирования массивами и строками)

Если я ввелэти зависимости, они загромождают мои конструкторы и отвлекают от конкретных зависимостей.Для тестирования я могу просто установить эти зависимости в своем сервисном локаторе перед запуском тестов.Прагматик во мне говорит, что у меня все хорошо, но пурист говорит, что я должен пройти весь путь с DI.

Вы бы порекомендовали DI для этих типов объектов или нет?

1 Ответ

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

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

Некоторые люди также беспокоятся о внедрении зависимостей, которые используются редко, но это тоже не проблема . Когда дело доходит до создания графов объектов, производительность редко является проблемой, и даже если это так, шаблон Virtual Proxy может это исправить.

Короче говоря, нет причин использовать Сервисный локатор. Всегда есть лучшая альтернатива, включающая правильную инверсию управления.

...