5

Guice では、モジュールがいつ構築されるかを完全に制御し、インストールしたコンストラクター引数でいくつかのモジュールを使用しました。

ただし、Dagger では、他のモジュールを参照する方法は @Module includes アノテーションを介して行われ、インストールするモジュールを作成する同じ方法は提示されません。

コンストラクター引数を持つ複数のモジュールから適切な ObjectGraph を作成することは可能ですか? 特に短剣コンパイラで動作し、循環グラフに陥らないものは?

4

2 に答える 2

3

ObjectGraph.create() はモジュールの変数リスト (Varargs) を取るので、これを行うことができます:

ObjectGraph objectGraph = ObjectGraph.create(new ProductionModule(context), new OverridingTestModule());

Dagger の InjectionTest.java を見てください (テスト「moduleOverrides」を参照してください): https://github.com/square/dagger/blob/master/core/src/test/java/dagger/InjectionTest.java

于 2013-04-16T19:40:20.590 に答える
3

同じオブジェクトを使用する複数のモジュールがある場合は、そのオブジェクトを独自のモジュールに分離する必要があります。たとえば、多くのモジュールが Application コンテキストを使用するため、次のモジュールがあります。

@Module
public class ContextModule {

    private final Context mContext;

    public ContextModule(Context context) {
        mContext = context;
    }

    @Provides
    public Context provideContext() {
        return mContext;
    }

}

したがって、コンテキストオブジェクトが必要なときに他のモジュールにモジュールを含めるだけです。

例えば:

@Module(entryPoints = { MyFragment.class }, includes = { ContextModule.class })
public class ServicesModule {

    @Provides
    public LocationManager provideLocationManager(Context context) {

        return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }

    @Provides
    public Geocoder provideGeocoder(Context context) {
        return new Geocoder(context);
    }
}

次に、オブジェクト グラフを作成すると、アプリケーション コンテキストを引数として取るモジュールが 1 つだけになります。

于 2013-04-13T23:09:59.820 に答える