Неправильно ли использовать Service Locator для предоставления экземпляра контейнера службе?

Я использую сервисный уровень, тогда у меня много сервисов, таких как:

  • Пользовательская служба
  • СтатьяСервис
  • КомментарийСервис
  • Служба авторизации

Иногда мне нужно использовать Сервис из другого Сервиса.

В настоящее время я использую sfServiceContainer для внедрения зависимостей и внедряю свой диспетчер сущностей Doctrine 2 в некоторые из своих служб, однако я думаю переключить и внедрить экземпляр контейнера, чтобы иметь возможность получать любую службу и EntityManager.

Но я застрял, и я не уверен, что это хорошая идея.


person JohnT    schedule 15.05.2011    source источник


Ответы (1)


Можно использовать Service Locator, если ваш контейнер не предоставляет вам лучший способ сделать это.

Если вы используете такой контейнер, как Ding (http://marcelog.github.com/Ding), ваши службы будут bean-компонентами, и вместо локатора служб вы можете реализовать в этих службах интерфейс IContainerAware.

Затем контейнер будет внедряться всякий раз, когда создаются эти bean-компоненты, и вы можете затем $this->getBean('aService') непосредственно из этих сервисов/bean-компонентов. В случае с Ding есть даже пример интеграции с Doctrine2 (включая внедрение EntityManager)

person marcelog    schedule 07.07.2011