(jp) =
最新のフレームワークを使用している場合、依存性注入に大きく依存している可能性があります。 しかし、依存性注入とは何か知っていますか 実際に について – またはより良い: それは何ですか いいえ?
# 依存コンテナー
最新のすべてのフレームワークには、依存関係コンテナー (オブジェクトを作成する方法を知っている大きなボックス) が同梱されていますが、実際に依存関係注入パターンを想定どおりに使用できるとは限りません。
コンテナ できる クラスに依存関係を注入するのがはるかに簡単になりますが、かなり悪用される可能性もあります。
# サービスの場所
コンテナーを (ab) 使用する 1 つの方法は、 引く それらを現在のコンテキストに注入する代わりに、そこからオブジェクトを削除します。 このパターンは「サービスの場所」と呼ばれ、依存性注入の反対です。 次のようになります。
class MyController
public function indexAction()
$service = app(Service::class);
サービスの場所は、コンテナーに特定のオブジェクトを要求します。 これにより、テストが困難なポイントからこのサービスをプルしているコンテキストと、外部へのブラックボックスが作成されます。どのような外部依存関係があるかを知ることができません MyController
すべてのコードを見なくても使用できます。
一部のフレームワークでは、プロジェクトの開始時にコンテナーを簡単かつ迅速に使用できるため、このコンテナーの使用を促進しています。 コンテナーに数百、場合によっては数千のクラスが登録されているプロジェクトでは、サービスの場所を使用すると混乱する可能性があります。 依存性注入を適切に使用することで解決するもの。
また、サービスの場所がアンチパターンである理由に関する私の投稿を読むことをお勧めします。
# 共有依存関係
よりポジティブな雰囲気に移りましょう。コンテナをうまく活用することです。
依存性注入が適切に使用されると、外部コンテキスト (多くの場合コンテナー) は、クラスに注入する具体的な依存性を制御できます。 これは、同じオブジェクトを他のいくつかのコンテキストに注入できることを意味します。これらのコンテキストは、それらが「シングルトン」または「共有依存関係」であることを知る必要はありません。
依存関係を共有することは効果的で強力なことですが、それでも いいえ 依存性注入とは何か、むしろ有益な副作用です。
# 自動配線
最後に、依存性注入とは関係のないもう 1 つの便利な機能、オートワイヤリングです。
開発者の柔軟性を高めるために、一部のコンテナでは、自動的に決定されるスマートなクラス定義が可能です。 これは、すべてのクラスの構築方法を手動で記述する必要がないことを意味します。 これらのコンテナはコードをスキャンし、タイプ ヒントとドキュメント ブロックを調べて必要な依存関係を判断します。
ここで多くの魔法が起こりますが、自動配線は迅速なアプリケーション開発に役立つツールです。
ここまでで、依存性注入の基本について復習したい場合 は 約。 ここでそれを読むことができます。