Dagger 2:Gradle模块依赖与另一个模块中的实现

时间:2016-03-21 15:43:07

标签: android gradle dependency-injection dagger-2

我正在尝试设置一个项目,其中我有两个模块common-libapp

lib模块有自己的Dagger组件和模块,它应该与风格无关。

现在,部分内容取决于模块app中声明的特定于风味的资源值,因此我尝试通过接口抽象组件并覆盖模块app中的实现。

Dagger模块在common-lib gradle模块中声明,满足NoOp实现的依赖性。

    @Module
public class NetworkConfigModule {
    @Provides
    @Singleton
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){
        return noOpHeaderParams;
    }

    @Provides
    @Singleton
    AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){
        return noOpAppHostsProvider;
    }
}

Dagger模块在app gradle模块中声明,满足与实际实现的依赖关系。

@Module
public class NetworkConfigModule {

    @Provides
    @ApplicationScope
    HeaderParams providesHeaderParams(KaufdaHeaderParams kaufdaHeaderParams){
        return kaufdaHeaderParams;
    }

    @Provides
    @ApplicationScope
    AppHostsProvider providesAppHostsProvider(KaufdaAppHostsProvider implementation){
        return implementation;
    }
}

这不起作用,因为Dagger并没有覆盖Module类,但这是预期的。

我的问题是,我如何设置Dagger模块,以便在HeaderParams中使用AppHostsProvidercommon-lib接口,但我在app中注入了它们的实现。

1 个答案:

答案 0 :(得分:3)

最简单的方法是在app中处理组件创建。

在您的应用中,您知道要使用的实际模块和类。如果在那里创建组件,只需将正确的模块添加到组件中,注入common-lib类并完成。

如果您不想在应用程序中处理注入,则需要定义一个接口,例如

interface NetworkComponentHolder {
    NetworkComponent getNetworkComponent();
}

然后您可以使用Application中的app来实施。同样,您必须在app中创建组件和模块,然后从您的模块中调用

((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);

这将是不使用反射的两种可能性。