避免使用服务定位器进行并行继承


Avoiding parallel inheritance with service locators

我有目前的情况:

A有一个抽象类Controller,它具有依赖项,这些依赖项在运行时由服务定位器Locator注入。服务定位器得到了正确的实现——它不是在整个应用程序中传递的,只由作为应用程序根对象的Controller使用。

我遇到的问题是,当我从Controller继承时,如何构建服务定位器——我不一定希望(也不希望)扩展基本服务定位器Locator,但我需要复制父类的依赖项。

下面是一些示例代码来解释发生了什么:

// Controller.php
namespace abstract;
abstract class Controller {
    public function __construct( $locator ) {
        $this->template_handler = $locator->getTemplateHandler();
        $this->input_sanitizer = $locator->getInputSanitizer();
    }
}

-

// Controller.php
class Controller extends abstract'Controller {
    public function __construct( $locator ) {
        $this->data_factory = $locator->getDataFactory();
        parent::__construct( $locator );
    }
}

-

// Locator.php
namespace abstract; 
class Locator {
    public function getTemplateHandler() {
        return 1234;
    }
    public function getInputSanitizer() {
        return 1234;
    }
}

所以我想问题变成了——如何定义我的Locator类?我是扩展abstract'Locator(创建一个并行继承树),还是在不扩展abstract'Locator的情况下实现相同的方法(这是重复的代码),还是做了一些我没有想到的不同的事情?

您应该在所有控制器中使用一个定位器。当然,除非服务非常具体。否则,如果您必须首先定位所需的定位器,那么服务定位器的用途是什么?