android - Dagger2 - 在运行时定义/更新对象的值

标签 android dependency-injection dagger-2

背景:

我在我的 Android 应用程序中使用 Dagger2 进行依赖项注入(inject),我想将一个对象作为单例注入(inject)到我的 BaseActivity 中,以便在整个应用程序中可用,但Object的值只能在认证过程后设置,其值取决于认证的结果。

构建:

这就是我当前的设置:

public interface Tool {
 ...
}

public class ToolOne implements Tool {
 ...
}

public class ToolTwo implements Tool {
 ...
}

一个通用接口(interface)及其两种不同的实现。

public class ToolConfig {

 private Tool currentTool;

 public ToolConfig(Tool tool) {
   this.currentTool = tool;
 }
 ...
}

充当配置并在整个应用程序中使用的类。

@Provides
@PerApplication
ToolConfig provideToolConfig(Tool tool) {
        return new ToolConfig(tool);
}

在我的 Dagger ToolModule 中定义配置的方式。这将被注入(inject)到 BaseActivity 中以供所有类使用。

任务:

如何设置配置的currentTool值?根据身份验证过程,应将 ToolOneToolTwo 设置为 currentTool 的值。如果再次进行身份验证过程,应该可以更改它。设置一次后很少会出现这种情况,但它可能会发生,并且我想确保始终使用该对象的相同实例。

有推荐的方法可以让我使用 Dagger2 做到这一点吗?

最佳答案

您可以只定义 @Provides在它们之间重定向的方法:

@Provides Tool provideTool(
    AuthenticationController authController,
    Provider<ToolOne> toolOneProvider,
    Provider<ToolTwo> toolTwoProvider) {
  if (authController.useToolTwo()) {
    return toolTwoProvider.get();
  }
  return toolOneProvider.get();
}

但是,在这种情况下,您需要非常小心,仅注入(inject) Provider<Tool> (每次调用 get 时都会检查 AuthController )而不是 Tool (当创建 Tool 注入(inject)类时,它将检查 AuthController 一次,但不会自动更新)。因此,创建一个自定义的单方法 ToolProvider 可能是有意义的,您可以在 @Provides 方法中根据需要注入(inject)三个依赖项,并将当前工具作为 getCurrentTool 返回。调用(等)。

关于android - Dagger2 - 在运行时定义/更新对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921103/

相关文章:

Android 模拟器不在 Virtualbox Ubuntu 实例中启动

android - 通过usb与android应用程序通信

android - Dagger2 组件(非作用域)不能依赖于作用域组件 - 错误

dagger-2 - Dagger 2 依赖项可以是不可注入(inject)的吗?

android - 日历备份和恢复

Android:使用动态子布局(ViewHolder 和 SubViewHolder)绑定(bind)布局

wcf - 将 Unity 依赖注入(inject)与 WCF 服务一起使用

c# - 使用 LightInject 注册所有实现通用接口(interface)的类

java - 在 Jersey GET 响应中使用外部对象

android - 错误 : cannot find symbol variable DaggerAppComponent