0

特定のクラスがセッターインジェクションに必要なインターフェイスの実装を指定するにはどうすればよいですか?たとえば、コンストラクターインジェクション用に機能していますが、セッター用には機能していません。

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

ラルフのDIの例を見つけたようです。良い。それが私の最初の提案になるでしょう。:)

私は間違っているかもしれませんが(DIを使用してからしばらく経ちます)、あなたが思っているよりも簡単かもしれません。

このようにセッターインジェクションを使用する:

$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',
            ),
        ),
    )
)));

インターフェイスのインスタンス定義する場合は、「設定」の設定について心配する必要があります。その場合、何か注意が必要な場合は、プリファレンス定義とともにいくつかのエイリアスを使用することを検討してください。

于 2012-09-19T21:38:00.080 に答える