Dagger 2跨模块依赖

时间:2016-07-01 23:25:55

标签: android dependency-injection dagger-2

在我目前的项目中,我们有ApplicationComponent,其中包含各种模块,包括NetworkModule

DaggerApplicationComponent.builder()
    .applicationModule(new ApplicationModule(this))
    .networkModule(new NetworkModule())
    .apiModule(new ApiModule())
    .build();

我现在想要设置一个UserServices模块,该模块将至少提供一个UserServices对象,该对象需要其他模块提供的一些配置。例如,NetworkModule提供了HttpLoggingInterceptor.Level,用于应用中的其他网络调用,我想在UserServices调用中使用相同的内容。

NetworkModule的调试版本的示例:

@Module
public class NetworkModule extends BaseNetworkModule {
    HttpLoggingInterceptor.Level getHttpLoggingInterceptorLevel() {
        return HttpLoggingInterceptor.Level.BODY;
    }
}

为了封装,我希望将UserServices提供在自己的模块中。

如何设置UserServices模块,使其可以包含在同一个组件中,并且可以访问NetworkModule中的“提供”,以配置它提供的UserServices对象?

由于

2 个答案:

答案 0 :(得分:1)

我通过一些试验和错误来解决这个问题。如果依赖模块已经包含在component中,那么我只需将includes参数添加到@Module注释中:

@Module(includes= {
        NetworkModule.class,
        ApiModule.class
    })

在我的例子中,依赖模块和其他一些模块在几个地方使用,并且在component本身中都需要独立模块。幸运的是,似乎Dagger会在同一组件中的模块之间为我添加内容。所以在这种情况下我真的不需要做任何特别的事情 - 就在组件中这样做:

@Singleton
@Component(modules = {
            ApplicationModule.class,
            NetworkModule.class,
            SchedulerModule.class,
            ApiModule.class,
            UserServicesModule.class
    })

答案 1 :(得分:0)

您可以将网络模块作为依赖项添加到UserServices模块,或将网络组件作为依赖组件添加到UserServices组件。如果作为依赖组件添加,您必须在网络组件中提及提供程序。