在模塊內部,如果我需要根據模塊構建時已知的變量提供不同的接口實現,我可以將該邏輯放置在該接口類型的@Provides方法中。像這樣:如何告訴Dagger 2根據X實例化哪個實現?
@Module
public class FooModule {
private final State state;
public FooModule(State state) {
this.state = state;
}
@Provides
FooInterface provideFooImplementation() {
switch(state) {
case STATE_1:
return new FooImpl1();
case STATE_2:
return new FooImpl2();
...
case STATE_10:
return new FooImpl10();
}
}
}
但是,這些實現可以由Dagger創建。我寧願說「嗨,基於X我想讓你爲我實例化這個類」
我已經考慮了幾個選項。
更改提供方法採取所有可能的實現:
@Provides FooInterface provideFooImplementation(FooImpl1 impl1, FooImpl2 imp2, ..., FooImpl10 impl10) { switch(state) { case STATE_1: return impl1; case STATE_2: return impl2; ... case STATE_10: return impl10; } }
這使得匕首實例化他們,滿足他們所有的依賴關係,但它不是,如果每一個好主意的實現相對較大或昂貴。
更改提供方法以獲取不同實現的所有依賴關係的集合。
@Provides FooInterface provideFooImplementation(Context context, Repo repo, HttpClient httpClient, ...) { switch(state) { case STATE_1: return new FooImpl1(context); case STATE_2: return new FooImpl2(repo, httpClient); ... case STATE_10: return new FooImpl10(context, repo); } }
這比在匕首選擇1稍微好一點不必實例化每一個執行,但它仍然需要實例所有,即使他們可能不會在所有情況下使用的依賴關係。即使可以由Dagger創建,我也可以自己創建對象。
爲每個實現創建一個模塊並實例化相應的模塊。因此,像:
@Module public FooImpl1Module { @Provides FooInterface provideFooImplementation(Context context) { return new FooImpl1(context); } }
這將是罰款,但現在我有界定取決於模塊組件的問題。
解決此問題的最佳方法是什麼?
一個建議是嘗試選項1,參數包含在Lazy中。然後我只能在一個上調用.get()。我會盡我所能,併發布結果
你有沒有使用組件提供方法或'@ Named'註釋手動考慮? – EpicPandaForce
EpicPandaForce,@本身不起作用,因爲依賴對象不知道它需要哪個實現。組件提供方法是什麼意思? –