2

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これにより、コードベース全体の他のすべてのオブジェクトが、それらが属する「ツリー」に適切なルート オブジェクトを要求できるように、これらの各ツリーのルートを返す何らかのオブジェクトが必要になります。これはすでに非常に複雑に聞こえます。

ブートストラップが現実の世界でどのように実践されているかを示す実際のコード例は、これを明確にするのに役立つかもしれません。前もって感謝します!

4

1 に答える 1

2

良い例を見つけるのに苦労している理由は、必要以上に複雑にしているからだと思います。ブートストラップは、コード スニペットほど複雑ではありませんが、おそらくメソッドを呼び出す必要があるroot1root2、アプリケーションが実行することを開始する必要があることを除けば!

残りは Guice によって処理されます。実行中にインスタンス化されるオブジェクトは、注釈付きの@Injectコンストラクター (またはメソッド) を介して、Guice から必要なものを取得します。DI コンテナーがすべてのインスタンスを管理するため、すべてのツリーのすべてのルートを制御する Boosttrapper オブジェクトを用意する必要はありません。あるツリーのオブジェクトが別のツリーのオブジェクトを必要とする場合は、それで十分@Injectです! Bootstrapper オブジェクトに「要求」する必要はありません。これは、バックグラウンドのある人にとっては想像しにくい場合もありServiceLocatorますが、実際には、クラスを設計するためのはるかにまとまりのある方法です。

Guice には、依存関係グラフを管理するためのツールがいくつかあります。異種の依存関係ツリーは、まとまりのあるバインディングのセットであるモジュールを通じて管理されます。したがって、Guice は機能をカプセル化し、インジェクターに相互依存関係を解決させることを奨励します。また、Guice は必要になるまでグラフをインスタンス化せず (積極的にロードできるシングルトンを除いて)、開発者はProviderインターフェイスとメソッドを使用して明示的にインスタンス化を遅らせることができます。

Guice をどのようなアプリケーションに使用したいのか、またはどのようなアプリケーションに慣れているのかを説明していただけると助かります。そうすることで、意味のないことをよりよく理解できるようになります。

于 2012-04-15T03:43:05.430 に答える