DI メカニズムからオブジェクト インスタンスを明示的に要求することは、DI/IoC の一般的なアンチパターンと見なされることを読みました。これは、オブジェクトがスコープに入るまでに、必要なすべての依存関係が既に注入されている必要があるためです。Guice-land では、このようなアンチパターンは次のように表されます。
Service svcImpl = (Service)injector.getInstance(Service.class);
どうやら、このアンチパターンの 1 つの例外は、ブートストラップ/依存関係の解決フェーズです。そこでは、Guice にすべてのトップレベルのルート(他のすべてのオブジェクトがそこから流れるという意味での「ルート」) オブジェクトを要求します。
興味深いことに、オンラインで徹底的に検索しても、このブートストラップ プロセスの実用的で機能するコード例を見つけることができません。私はそれが次のように見えると想像します:
public void bootstrap() {
RootObj1 root1 = (RootObj1)injector.getInstance(RootObj1.class);
RootObj2 root2 = (RootObj2)injector.getInstance(RootObj2.class);
this.root1 = root1;
this.root2 = root2;
// Since all objects flow from these two "root" dependencies, bootstrapping
// is complete. root1 and root2 contain all the dependencies the application
// needs from here on out, and the "injector" object is no longer needed.
// More importantly, injector is never used anywhere else in the code, and
// therefore the code is not in violation of this anti-pattern.
}
これは正しいですか、それとも私はここで基地から外れていますか? 実用的な例が見つからないという理由だけでお願いします!!
私がこれを書いているとき、これは実現可能/実用的ではないように思われるので、私は自分自身を推測し始めています.
これは、実際には、アプリケーションの依存関係グラフが、それぞれが独自のルートを持つ多数の個別の異なる「依存関係ツリー」を含む大規模になるためです。Bootstrapper
これにより、コードベース全体の他のすべてのオブジェクトが、それらが属する「ツリー」に適切なルート オブジェクトを要求できるように、これらの各ツリーのルートを返す何らかのオブジェクトが必要になります。これはすでに非常に複雑に聞こえます。
ブートストラップが現実の世界でどのように実践されているかを示す実際のコード例は、これを明確にするのに役立つかもしれません。前もって感謝します!