0

如何指定特定类需要 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 附带的单元测试,但没有发现任何问题。

4

1 回答 1

1

看起来您已经找到了 Ralph 的DI 示例。好的。那将是我的第一个建议。:)

我可能错了(自从我使用 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',
            ),
        ),
    )
)));

如果您要定义一个interface的实例,那么您需要担心设置“首选项”;在这种情况下,如果您有一些棘手的问题,您可能会考虑使用一些别名以及首选项定义。

于 2012-09-19T21:38:00.080 回答