在我的应用程序中,我有两种模式:demo和real。在演示模式下,我使用另一个类来模拟服务器通信:
@Module(...)
public class CommunicationModule {
@Provides @Singleton CommunicationWrapper provideNetworkBusWrapper(Application app) {
boolean isDebug = ((MyApplication) app).isDebug();
CommunicationWrapper result = null;
if (isDebug) {
result = new DemoWrapper(app);
} else {
result = new NetworkWrapper(app);
}
return result;
}
}
现在,在执行特定用户操作后,我想重新初始化此依赖关系。是否可以在不重建整个ObjectGraph
的情况下完成它?
答案 0 :(得分:2)
您可以重新注入对象,以便根据您的标志更改实现。只需从提供方法中删除@Singleton
注释即可。
以下是示例代码:
public class SomeActivity extends Activity {
@Inject CommunicationWrapper mCommunicationWrapper;
@Override
protected void onCreate(Bundle savedInstanceState) {
((MyApplication) getApplication()).inject(this);
// using NetworkWrapper
...
}
public void userActionHandler(){
((MyApplication) getApplication()).setDebug(true);
((MyApplication) getApplication()).inject(this);
// using DemoWrapper
...
}
请记住,将重新注入该类的所有依赖项。
答案 1 :(得分:1)
此评论对待Dagger 1
我不确定它是否会对您有所帮助但是您已经分析了U2020 app created by Jake Wharton as example of using Dagger? 根据我的分析,他在调试模式下添加了两个图表(标准模块和调试模块)。调试模块可以覆盖标准模块的功能(在运行时),但我还没有找到它实现的确切位置。在这个应用程序中它由菜单中的按钮提供 - 也许你会发现它更快(我有一些gradle的问题)
答案 2 :(得分:1)
要有条件包含2个版本,但想要换掉其他一些变化条件,你可以从单例中提供2种类型,然后从没有单例的情况下提供你的依赖。
// DemoWrapper.java
@Singleton // Alternatively, you could add provides methods for the wrapper types and annotate those with @Singleton
class DemoWrapper { ... }
// NetworkWrapper.java
@Singleton
class NetworkWrapper { ... }
// CommunicationModule.java
@Module(
...,
injects = {
DemoWrapper.class,
NetworkWrapper.class
}
)
public class CommunicationModule {
@Provides
CommunicationWrapper provideNetworkBusWrapper(Application app, DemoWrapper demo, NetworkWrapper network) {
boolean isDebug = ((MyApplication) app).isDebug();
return isDebug ? demo : network;
}
}