让我们假设我有一个可以调用其他服务的服务,具体取决于所谓的方法:
class Foobar
{
public function foo() {
return *SERVICE_A*->baz();
}
public function bar() {
return *SERVICE_B*->qux();
}
}
现在当我调用Foobar的foo()方法时,我需要为Foobar提供SERVICE_A。我可以通过将SERVICE_A和SERVICE_B定义为Foobar的依赖关系并将其创建委托给构建阶段的服务容器,使用setFO的setServiceA()或setServiceB()方法之类的setter从外部注入它们,或者将服务容器传递给我来实现。 Foobar使其能够仅构建目前真正需要的服务。
第一个选项对我来说似乎不对,因为它会创建SERVICE_A和SERVICE_B,即使其中一个不会被调用。 第二种选择显然是错误的,因为它将服务基础设施暴露给外部世界。 第三种选择也不好,因为它使服务依赖于使代码难以测试的整个服务容器等。
所以我的问题是, 有没有办法延迟加载服务依赖?