我正在尝试建立一个项目,其中有两个模块 common-lib
和 app
.
lib 模块有自己的 Dagger 组件和模块,它应该与风格无关。
现在,它的一部分取决于模块 app
中声明的特定于 flavor 的资源值。 ,所以我尝试通过接口(interface)抽象组件并在模块 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
和 AppHostsProvider
common-lib
中的接口(interface),但我在 app
中注入(inject)了它们的实现.
最佳答案
最简单的方法是在您的 app
中处理组件创建。 .
在您的应用程序中,您知道要使用的实际模块和类。如果您在那里创建组件,您只需将正确的模块添加到组件中,注入(inject)您的 common-lib
上课并完成。
如果您不想在应用程序中处理注入(inject),则需要定义一个接口(interface),例如
interface NetworkComponentHolder {
NetworkComponent getNetworkComponent();
}
然后你可以用你的
Application
来实现在 app
.同样,您必须在 app
中创建组件和模块。 ,但随后您可以从您的模块中调用((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);
这将是不使用反射的两种可能性。
关于android - Dagger 2 : Gradle module dependency with implementation in another module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135529/