2016-10-07 33 views
0

背景:Dagger2 - 在運行時確定對象/更新值

我在我的Android應用程序中使用Dagger2依賴注入,我想注入的對象作爲單到我BaseActivity可用貫穿整個應用程序,但Object的值只能在認證過程後設置,其值取決於認證結果。

編譯:

這就是我目前的設置是這樣:

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; 
} 
... 
} 

一個用作配置的類,用於整個應用程序。

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

配置在我的ToolModule中爲Dagger定義的方式。這將被注入BaseActivity以供所有類使用。

任務:

我怎樣才能設置currentTool的配置價值?根據驗證過程,ToolOneToolTwo應設置爲值currentTool。如果認證過程再次完成,應該可以更改它。在設置一次後很少會出現這種情況,但可能會發生,我想確保始終使用該對象的同一個實例。

有沒有建議的方式,我可以用Dagger2做到這一點?

+0

我懷疑你能做到這一點。 Afaik Dagger2在編譯時工作 – Blackbelt

+0

我知道,但在這種情況下找到一個無匕首的解決方法來使用依賴注入似乎很奇怪,我希望有一種方法。 – Eve

+0

使用不同的噴油器。 Dagger2只是一個難題。 Dagger2不是依賴注入。 – Blackbelt

回答

0

你可以只定義一個@Provides方法,它們之間重定向:

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

然而,在這樣的情況下,你需要非常小心,只注入Provider<Tool>(這將檢查AuthController每您可以撥打get),而不是Tool(當Tool-injected類創建但不會自動更新時,它將檢查一次AuthController)。由於這個原因,創建一個自定義的單一方法的ToolProvider是有意義的,在這個方法中你在@Provides方法中根據需要注入三個Deps,並以getCurrentTool調用(etc)的形式返回當前工具。