7

目前,我已经准备好一个 Symfony2 DI 容器实例,其中包含一个服务及其所有依赖项。例如,我有一个 Car 类,它有 Engine 和 Lights 作为依赖项。

在我当前的设置中,这两个依赖项都是在创建 Car 对象时通过 setter 注入自动创建的,但很可能我的 Car 对象这次不需要它的灯,因此它不需要显式创建实例这种依赖。

有没有办法在 Symfony DI 中实现这一点?因此仅在需要时创建 Lights 对象的实例?我的猜测是它会是某种像 Doctrine 一样的代理实现,但据我所知,它在 Symfony DI 中不存在。

4

4 回答 4

2

问题已经得到解答,但是对于谁需要这个功能,Symfony 2.3 中实现了惰性服务。

您需要安装ProxyManager bridge.

你可以在这里找到官方文档。

于 2013-10-23T13:15:49.183 回答
2

通过您的 services.yml 自动注入通过构造函数强制执行的依赖关系。
如果您有可选的依赖项,请在需要时通过 Controller 中的 setter 注入它们。

$this->container->get('cars')->setLights(new \Namespace\Lights());

当然,您的 Cars 类必须像这样设计,并且您必须自己在控制器或任何需要的代码中指导注入。

于 2012-07-27T12:41:48.680 回答
1

一个非常有趣的问题,但我认为在 Symfony2 的依赖注入容器中是不可能的。容器只知道你告诉它什么——在这种情况下,你有一个依赖于特定用例的依赖。另外,服务的注册发生在应用程序生命的早期,所以我不知道你怎么能让它工作。

也许您应该使用工厂模式。将 a注册CarFactory为服务,然后在获取Car实例时,您可以指定它应该包含Light依赖项。

我能问一下你为什么要实现这个目标吗?可能有更简单的解决方案。

于 2012-07-10T22:18:12.607 回答
0

这不是一个很好的解决方法,但您可以尝试注入整个 DIC,然后在必要时获取 Light 和 Engine 服务。

我在课堂上考虑过类似这种方法Car

protected function getLightService() 
{
    if (!$this->light) {  //so we reuse the first instance
        $this->light = $this->dic->get("car.light");
    }

    return $this->light;
}
于 2012-07-11T08:49:20.360 回答