在 Guice 中,我可以完全控制何时构建模块,并使用一些带有我安装的构造函数参数的模块。
然而,在 Dagger 中,引用其他模块的方法是通过 @Module 包含注释,并且没有向我提供创建要安装的模块的相同方法。
是否可以从具有构造函数参数的多个模块创建一个健全的 ObjectGraph?尤其是可以与 dagger-compiler 一起使用,并且不会遇到循环图的?
在 Guice 中,我可以完全控制何时构建模块,并使用一些带有我安装的构造函数参数的模块。
然而,在 Dagger 中,引用其他模块的方法是通过 @Module 包含注释,并且没有向我提供创建要安装的模块的相同方法。
是否可以从具有构造函数参数的多个模块创建一个健全的 ObjectGraph?尤其是可以与 dagger-compiler 一起使用,并且不会遇到循环图的?
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
如果您有多个模块使用相同的对象,那么也许您应该将该对象分离到它自己的模块中。例如,很多模块使用应用程序上下文,所以我有以下模块:
@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);
}
}
然后,当我构造对象图时,我最终只得到一个将应用程序上下文作为参数的模块。