2012-09-19 94 views
0

如何指定特定類需要setter注入的接口的實現? 我有一個工作,例如構造函數注入,但不適用於setter。通過接口的Zend Framework 2依賴注入

class Lister1 { 
    public $finder; 
    public function setFinder(Finder $finder){ 
     $this->finder = $finder; 
    } 
} 

interface Finder { 
    public function findAllByName($name); 
} 

class FinderImpl1 implements Finder { 
    public function findAllByName($name) {} 
} 

現在爲上面的代碼工作。

$di = new Di(); 
$di->instanceManager()->addTypePreference(
    'Finder', 
    'FinderImpl1' 
); 
$lister = $di->get('Lister1'); 

但如果我有以下以及

class Lister2 extends Lister1{ 
} 
class FinderImpl2 implements Finder { 
    public function findAllByName($name) {//assume a different impl} 
} 

所以Lister1需要FinderImpl1注入& Lister2需要FinderImpl2注入。
我們可以在每個班的基礎上添加一個類型首選項嗎?
我看了一下裝有zf2的單元測試,但沒有發現任何內容。

回答

1

看起來你已經找到了拉爾夫的DI examples。好。那將是我的第一個建議。 :)

我可能是錯的(自從我用DI以來已經有一段時間了),但它可能比您想象的要簡單。

使用setter注入,像這樣:

$di = new Zend\Di\Di; 
$di->configure(new Zend\Di\Config(array(
    'instance' => array(
     'Lister1' => array(
      'parameters' => array(
       'finder' => 'FinderImpl1', 
      ), 
     ), 
     'Lister2' => array(
      'parameters' => array(
       'finder' => 'FinderImpl2', 
      ), 
     ), 
    ) 
))); 

如果你要定義一個實例的接口的,然後你需要擔心設置一個「偏愛」;在這種情況下,如果您有些棘手的問題,您可以考慮使用一些別名以及首選項定義。

+0

非常感謝大衛,這確實有效。 – SuprF1y