2012-09-19 63 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