带有构造函数参数的Dagger模块?

时间:2013-04-06 02:27:50

标签: dependency-injection dagger

在Guice中,我完全控制了构造模块的时间,并使用了一些模块和我安装的构造函数参数。

然而,在Dagger中,引用其他模块的方法是通过@Module包含注释,并没有向我提供创建要安装的模块的相同方法。

是否可以从具有构造函数参数的多个模块创建一个理智的ObjectGraph?特别是可以使用匕首编译器,而不会遇到循环图的那个?

2 个答案:

答案 0 :(得分: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 :(得分: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