Zend Framework 2依赖注入通过接口

时间:2012-09-19 10:50:54

标签: dependency-injection zend-framework2

如何指定特定类对setter注入所需的接口实现? 我有一个工作,例如构造函数注入,但不适用于setter。

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 个答案:

答案 0 :(得分: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',
            ),
        ),
    )
)));

如果您要定义接口的实例然后,您需要担心设置“首选项”;在这种情况下,如果你有一些棘手的东西,你可以考虑使用一些别名和偏好定义。