避免与服务定位器的并行继承

时间:2012-02-23 20:57:53

标签: php oop inheritance dependency-injection

我有目前的情况:

A有一个抽象类Controller,它具有依赖关系,这些依赖关系由服务定位器Locator在运行时注入。服务定位器已正确实现 - 它不会在整个应用程序中传递,只能由Controller使用,这是应用程序的根对象。

我遇到的问题是当我从Controller继承时如何构造服务定位器 - 我不一定希望(并且不希望)扩展基本服务定位器{{1但是我需要复制父类的依赖关系。

以下是一些示例代码,用于解释正在发生的事情:

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(这个重复的代码),或者我做了一些我没想过的不同的东西?< / p>

1 个答案:

答案 0 :(得分:0)

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