我正在尝试设置一个项目,其中我有两个模块common-lib
和app
。
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
中使用AppHostsProvider
和common-lib
接口,但我在app
中注入了它们的实现。
答案 0 :(得分:3)
最简单的方法是在app
中处理组件创建。
在您的应用中,您知道要使用的实际模块和类。如果在那里创建组件,只需将正确的模块添加到组件中,注入common-lib
类并完成。
如果您不想在应用程序中处理注入,则需要定义一个接口,例如
interface NetworkComponentHolder {
NetworkComponent getNetworkComponent();
}
然后您可以使用Application
中的app
来实施。同样,您必须在app
中创建组件和模块,然后从您的模块中调用
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);
这将是不使用反射的两种可能性。