Guice では、モジュールがいつ構築されるかを完全に制御し、インストールしたコンストラクター引数でいくつかのモジュールを使用しました。
ただし、Dagger では、他のモジュールを参照する方法は @Module includes アノテーションを介して行われ、インストールするモジュールを作成する同じ方法は提示されません。
コンストラクター引数を持つ複数のモジュールから適切な ObjectGraph を作成することは可能ですか? 特に短剣コンパイラで動作し、循環グラフに陥らないものは?
Guice では、モジュールがいつ構築されるかを完全に制御し、インストールしたコンストラクター引数でいくつかのモジュールを使用しました。
ただし、Dagger では、他のモジュールを参照する方法は @Module includes アノテーションを介して行われ、インストールするモジュールを作成する同じ方法は提示されません。
コンストラクター引数を持つ複数のモジュールから適切な ObjectGraph を作成することは可能ですか? 特に短剣コンパイラで動作し、循環グラフに陥らないものは?
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
同じオブジェクトを使用する複数のモジュールがある場合は、そのオブジェクトを独自のモジュールに分離する必要があります。たとえば、多くのモジュールが 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 つだけになります。