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

时间:2016-10-07 15:41:22

标签: android dependency-injection dagger-2

背景:

我在我的 this.http.get('https://api.backand.com:443/1/objects/todos?AnonymousToken=my-token') .map(res => res.json()) .subscribe( data => this.myData = data, err => this.logError(err), () => console.log('Request Complete') ); 应用中使用Dagger2进行依赖注入,我希望将一个对象作为单例注入我的BaseActivity,以便在整个应用中可用,但是对象只能在身份验证过程后设置,其值取决于身份验证的结果。

构建:

这是我目前的设置:

Android

一般界面及其两种不同的实现方式。

public interface Tool {
 ...
}

public class ToolOne implements Tool {
 ...
}

public class ToolTwo implements Tool {
 ...
}

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

public class ToolConfig {

 private Tool currentTool;

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

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

任务:

如何为配置设置@Provides @PerApplication ToolConfig provideToolConfig(Tool tool) { return new ToolConfig(tool); } 的值?根据身份验证过程,currentToolToolOne应设置为ToolTwo的值。如果再次执行身份验证过程,应该可以更改它。在设置一次之后很少会出现这种情况,但它可能会发生,我希望确保始终使用对象的相同实例。

我是否有建议的方法如何使用Dagger2?

1 个答案:

答案 0 :(得分:0)

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

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

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