如何使用Dagger重新注入特定对象

时间:2014-07-15 13:39:00

标签: java android dependency-injection dagger

在我的应用程序中,我有两种模式: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的情况下完成它?

3 个答案:

答案 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;
    }
}