如果单例是坏的,那么为什么服务容器是好的?
我们都知道单例有多糟糕,因为它们隐藏了依赖关系和其他原因。
但是在一个框架中,可能有许多对象只需要实例化一次,然后从任何地方调用(记录器,db等)。
为了解决这个问题,我被告知使用一个所谓的“对象管理器”(或像symfony这样的服务容器),它在内部存储对服务的每个引用(记录器等)。
但是,为什么服务提供商不如纯粹的单例那么糟糕呢?
服务提供商也隐藏了依赖关系,他们只是包装了第一个 istance 的创建。因此,我真的很难理解为什么我们应该使用服务提供商而不是单例。
PS.我知道,为了不隐藏依赖关系,我应该使用DI(如Misko所述)
加
我想补充一点:现在单例并不是那么邪恶,PHPUnit的创建者在这里解释了这一点:
DI + Singleton解决了这个问题:
<?php
class Client {
public function doSomething(Singleton $singleton = NULL){
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
?>
这是非常聪明的,即使这并不能解决所有问题。
除了 DI 和服务容器之外,是否有任何好的可接受的解决方案来访问此帮助程序对象?