【发布时间】:2012-02-02 03:57:44
【问题描述】:
我正在使用 yadif 的修改副本作为我的依赖注入框架。
目前,我创建了一个名为 AContainerAware 的抽象类,它类似于 symfony2 的 ContainerAware:
abstract class AContainerAware{
protected $_container;
public function setContainer(Container $container){
$this->_container = $container;
}
protected function get($component){
//return a component from $this->_container;
}
}
这在大多数情况下都很有效。我只有一个需要容器扩展 AContainerAware 的类,并且容器在使用setContainer() 创建对象期间由 DI 框架自动注入。然后我可以轻松地从容器中获取组件。
问题在于使用第三方供应商软件包时。在这些情况下,例如为 twig 编写扩展需要我扩展 Twig_Extension 类,这意味着我无法扩展 AContainerAware 来访问容器。
我在考虑要不要把AContainerAware变成接口IContainerAware。由于类可以实现多个接口,IContainerAware 在大多数情况下应该是可实现的。这种方法的唯一问题是不能在接口中为setContainer() 和get() 编写任何代码,因此必须在需要容器的每个类中为这些函数实现确切的代码是重复的。如果 setContainer() 和 get() 将来发生变化,也会带来维护问题。
有没有更好的方法来标记一个用于容器注入的类?
【问题讨论】:
-
你可以像这样扩展多个类:stackoverflow.com/questions/356128/…
-
我不太喜欢用
__call()伪造多重继承,但对我来说似乎不是很优雅。它还需要在类中实例化其中一个类的副本,这会破坏依赖注入。