如何指定特定类对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附带的单元测试,没有跳出来。
答案 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',
),
),
)
)));
如果您要定义接口的实例,然后,您需要担心设置“首选项”;在这种情况下,如果你有一些棘手的东西,你可以考虑使用一些别名和偏好定义。