1

最近、私はニキビを(サイレックスと一緒に)使い始めました。Pimple の使用方法に応じて、Service Locator または Dependency Injection Container のいずれかになります。Service Locator パターンを避けるべき理由を認識しています。それにもかかわらず、私を悩ませているように見えることの 1 つは、依存関係インスタンスが作成される瞬間です。

依存性注入の場合、必要なクラスのインスタンスが作成され、コンストラクターに渡されます。

class Foo{
    public $depend1;
    public $depend2;

    public function __construct($depend1, $depend2) {
        $this->depend1=$depend1;
        $this->depend2=$depend2;
    }

    public function task1() {
        return $this->depend1->run();
    }

    public function task2() {
        return $this->depend2->run();
    }
}

コンテナー自体をクラス コンストラクターに渡す場合、依存インスタンスは必要になるまで作成する必要はありません。

class Foo{
    public $app;

    public function __construct(\Silex\Application $app) {
        $this->app=$app;
    }

    public function task1() {
        return $app['depend1']->run();
    }

    public function task2() {
        return $app['depend2']->run();
    }
}

その結果、Foo クラスの 2 つのメソッドのうちの 1 つだけを呼び出す場合でも、最初の例では両方の依存インスタンスが作成されます。このコードは非常に単純な例ですが、より多くの依存構造を持つより複雑なクラスの場合、問題が大きくなると予想されます。他のいくつかの Dependency Injection Containers がプロキシ クラスを使用していることに気付きましたが、このライブラリには何も見つかりませんでした。Pimple を使用して依存関係を遅延ロードするより良い方法はありますか?

4

1 に答える 1

2

ほとんどの場合、これは問題ではありません。依存関係の初期化が実際のパフォーマンスの問題になる場合は、サービスを 2 つの個別のサービスに分割するか、最初の呼び出しで依存関係を遅延ロードするプロキシを作成する必要があります。

ProxyManagerと呼ばれる、自動プロキシ生成を提供する PHP 用のライブラリがあります。あなたの要件を知らなくても、私の最初の推測では、それはおそらくあなたにとってやり過ぎだろうということです。この方法で解決できる実際のパフォーマンスのボトルネックがあることを確認するまで、これについて心配する必要はありません。

于 2014-11-05T23:21:25.253 に答える