依存性注入は、負荷依存性を遅延させることを不可能にしますか?DIでは遅延読み込みができませんか?
ので、あなたはコンストラクタにインスタンスを渡す必要があるという事実を、あなたはあなたが遅延ロードが使用されているhttp://php.budgegeria.de/flzsbalQV2にsymfonyのDIコンポーネントの例を見つけることができます後で
依存性注入は、負荷依存性を遅延させることを不可能にしますか?DIでは遅延読み込みができませんか?
ので、あなたはコンストラクタにインスタンスを渡す必要があるという事実を、あなたはあなたが遅延ロードが使用されているhttp://php.budgegeria.de/flzsbalQV2にsymfonyのDIコンポーネントの例を見つけることができます後で
のインスタンスを作成することはできません。
クラスバーには、サービスとして設定されているFooへの依存関係があります。 Fooがインスタンス化されると、エコーが実行されます。ご覧のように、インスタンスはFoo依存メソッドへの最初のアクセスが発生したときに作成されます。
ocramius/proxy-managerコンポーザーパッケージが必要です。この遅延動作を他のDIコンテナに実装することもできます。
依存性注入は遅延ロード依存性を不可能にしますか?
いいえ、遅延読み込みを不可能にしません。私は逆に論じるつもりだし、動的な言語(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の機能です。
何かが常に必要なわけではないので、負荷を軽減したいですか?私。それは依存関係ではないのですか? –
その依存関係ですが、呼び出される可能性のある別のメソッドで使用されています – xpedobearx
次に、必要がない場合は、コンストラクタに渡すのではなく、セッタを渡します。次に、必要に応じて読み込むことができます。 –