背景:
我在我的 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);
}
的值?根据身份验证过程,currentTool
或ToolOne
应设置为ToolTwo
的值。如果再次执行身份验证过程,应该可以更改它。在设置一次之后很少会出现这种情况,但它可能会发生,我希望确保始终使用对象的相同实例。
我是否有建议的方法如何使用Dagger2?
答案 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
调用返回(等等)。