2016-10-30 20 views
1

依存性注入は、負荷依存性を遅延させることを不可能にしますか?DIでは遅延読み込みができませんか?

ので、あなたはコンストラクタにインスタンスを渡す必要があるという事実を、あなたはあなたが遅延ロードが使用されているhttp://php.budgegeria.de/flzsbalQV2にsymfonyのDIコンポーネントの例を見つけることができます後で

+0

何かが常に必要なわけではないので、負荷を軽減したいですか?私。それは依存関係ではないのですか? –

+0

その依存関係ですが、呼び出される可能性のある別のメソッドで使用されています – xpedobearx

+0

次に、必要がない場合は、コンストラクタに渡すのではなく、セッタを渡します。次に、必要に応じて読み込むことができます。 –

答えて

0

のインスタンスを作成することはできません。

クラスバーには、サービスとして設定されているFooへの依存関係があります。 Fooがインスタンス化されると、エコーが実行されます。ご覧のように、インスタンスはFoo依存メソッドへの最初のアクセスが発生したときに作成されます。

ocramius/proxy-managerコンポーザーパッケージが必要です。この遅延動作を他のDIコンテナに実装することもできます。

1

依存性注入は遅延ロード依存性を不可能にしますか?

いいえ、遅延読み込みを不可能にしません。私は逆に論じるつもりだし、動的な言語(PHPやRubyのような)が、静的型付けされた言語(JavaやC#のようなもの)よりもさらに簡単になると言うだろう。

コンポーネントが抽象化にプログラムするので、遅延読み込みが可能な実際の実装をラップする同じ契約のインプリメンテーションを簡単に挿入できます。ラッパーはプロキシのように動作し、これにより、消費者は遅延ロードが実行されているという事実に気付かないでおくことができます。これにより保守性が向上します。

私のPHPはかなり錆びているので、次の例は 'コンパイル'されていない可能性があります(PHPデベロッパー、この例を自由に変更してください)。

ここでは、いくつかのビジネスロジック(ShipOrderHandler)を実装し、それがロガーの依存関係に依存して、いくつかのクラスを参照してください。

class ShipOrderHandler { 
    private $logger; 

    function __construct($logger) { 
     $this->logger = $logger; 
    } 

    function Handle($command) { 
     $this->logger->Log("shipping order " + $command->OrderId); 
    } 
} 

class DatabaseLogger { 

    function Log($message) { 
     // log the message 
    } 
} 

これは、我々がShipOrderHandlerのためにオブジェクトグラフを作成する方法を次のとおりです。

$handler = new ShipOrderHandler(new DatabaseLogger()); 

私たちのDatabaseLoggerは実際には重くて初期化されないと想像してはいけません。 DIと動的言語の力を利用して、ロガー抽象のためのプロキシー実装を追加するだけです。 LazyLoggerとしましょう。私たちは次のように新しいLazyLoggerが見えるかもしれません:

class LazyLogger { 
    private $loggerFactory; 
    private $logger; 
    function __construct($loggerFactory) { 
     $this->loggerFactory = $loggerFactory; 
    } 

    function Log($message) { 
     if (!$this->logger) $logger = $loggerFactory(); 
     $this->logger.Log($message); 
    } 
} 

を現在、当社のアプリケーション・コンポーネントに変更を加えることなく、DatabaseLoggerを遅延作成するには、弊社のComposition RootにこのLazyLoggerを適用することができます。

ここ
$handler = new ShipOrderHandler(
    new LazyLogger(function() { return new DatabaseLogger() }); 

我々はラップLazyLoggerに注入される無名関数でのDatabaseLoggerの作成。 LazyLoggerのメソッドLogが最初に呼び出されると、ファクトリメソッドが呼び出され、DatabaseLoggerが作成され、LazyLoggerはそのインスタンスをキャッシュし、スコープ自体から外れるまで使用します。

依存性注入は実際には遅延ロードの使用を制限しません。これとは逆に、アプリケーション全体で徹底した変更を行う必要なしに、遅延ロードを可能にします。

これはDIの機能です。

関連する問題