2012-02-23 67 views
1

我目前的情況:避免與服務定位器平行繼承

A具有一個抽象類,Controller,其具有由一個服務定位器,Locator在運行時注入的依賴關係。服務定位器已正確實現 - 它不會在整個應用程序中傳遞,並且僅由作爲應用程序的根對象的Controller消耗。

我遇到的問題是如何構建的服務定位器(S),當我從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(這個複製代碼),還是我做了一些我沒有想到的不同的東西?

+1

'命名空間抽象;'是無效的語法 – Vitamin 2012-02-23 21:00:12

+2

這是非常真實的。我也忘記了我的要求,'Controller'除構造函數外沒有其他方法。感謝您提供有見地的提示。 – 2012-02-23 21:02:17

回答

0

您應該在所有控制器中使用一個定位器。當然,除非服務非常具體。否則,如果您必須首先找到所需的定位器,那麼服務定位器的目的是什麼?