我正在尝试建立一个项目,其中我有两个模块common-lib和app。
lib模块有它自己的Dagger组件和模块,并且应该是与味道无关的。
现在,它的一部分取决于模块app中声明的特定于口味的资源值,因此我尝试通过接口抽象组件并覆盖其在模块app中的实现。
Dagger模块在common-lib级模块中声明,满足与NoOp实现的依赖关系。
@Module
public class NetworkConfigModule {
@Provides
@Singleton
HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){
return noOpHeaderParams;
}
@Provides
@Singleton
AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){
return noOpAppHostsProvider;
}
}匕首模块在app级模块中声明,满足了与实际实现的依赖关系。
@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,但我在app中注入了它们的实现。
发布于 2016-03-21 16:57:07
最简单的方法是只处理app中的组件创建。
在你的应用程序中,你知道你想要使用的实际模块和类。如果在那里创建组件,只需将正确的模块添加到组件中,注入common-lib类并完成。
如果您不想在应用程序中处理注入,则需要定义一个接口。
interface NetworkComponentHolder {
NetworkComponent getNetworkComponent();
}然后,您可以使用Application在app中实现它。同样,您必须在app中创建组件和模块,但是可以从模块中调用
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);这将是不使用反射的两种可能性。
https://stackoverflow.com/questions/36135529
复制相似问题