使用服务定位器向服务提供容器实例是否错误


Is it wrong to use Service Locator to provide the container instance to a Service?

我正在使用服务层,然后,我有很多服务,例如:

  • 用户服务
  • 文章服务
  • 评论服务
  • 授权服务

有时我需要从另一个服务使用服务。

目前,我正在使用 sfServiceContainer 进行依赖注入,并将我的 Doctrine 2 实体管理器注入到我的一些服务中,但是,我正在考虑切换和注入容器实例以便能够获取任何服务和实体管理器。

但是我被困住了,我不确定这是一个好主意。

如果您的容器没有为您提供更好的方法来执行此操作,则可以使用服务定位器。

如果您使用像 Ding (http://marcelog.github.com/Ding) 这样的容器,您的服务将是 bean,而不是具有服务定位器,您可以在这些服务中实现 IContainerAware 接口。

然后,每当创建这些 bean 时,容器都会注入自身,然后你可以直接从这些服务/bean 内部$this->getBean('aService')。在Ding的情况下,甚至还有一个Doctrine2集成的例子(包括注入EntityManager)。