0

オブジェクトを作成するためにインジェクターを作成するとき、その間接的な依存関係のためにモジュールを含める必要がありますか?

たとえば、次のコードでは、main() でインジェクターをどのように作成すればよいでしょうか?

public class Foo {
    private Bar bar;

    @Inject
    public Foo(Bar bar) {
        this.bar = bar;
    }

    public static void main(String[] argv) {
        Injector injector = Guice.getInjector(new BarModule());
        // or Injector injector = Guice.getInjector(new BarModule(), new BarDepModule());
        Foo foo = injector.getInstance(Foo.class);
    }
}

//=====================
public interface Bar {}

public class BarImp {
    private BarDep barDep; // Dependency of Bar

    @Inject
    public Bar(BarDep barDep) {
        this.barDep = barDep;
    }
}
//=====================

もちろん、BarDep のバインドが必要です。問題は、BarDepModule を明示的にロードする必要があるか、それとも BarModule が責任を負うべきかということです。

4

2 に答える 2

0

はい、それはまさに戦略です。最高レベルのモジュールに依存関係をインストールさせると、サーバー/アプリがどのように構成されているかが明確になります。これは、読者がサーバーの構成方法を理解するのに役立ち、潜在的なバインディングの競合を排除する必要があります(Nachoの例で示されています)。プレゼンテーションのスライドはこちらです:http: //bit.ly/BigGuice2011

于 2012-07-08T17:51:55.033 に答える
0

Fred Faber は、このためのいくつかのベスト プラクティスをカバーするすばらしい講演を行いました (ただし、オンラインでスライドを見つけることができませんでした)。彼の提案は、モジュールのインストールを垂直に構造化することです。つまり、最上位レベルのコンポーネントがすべての依存関係のインストールを担当します。この場合、main は BarModule と BarDepModule の両方をバインドする必要があります。将来、たまたま BarDepModule に依存する NachoModule がある場合、このアプローチを採用してもバインディングの競合に遭遇することはありません...

于 2012-07-06T17:12:47.807 に答える