2016-03-21 116 views
0

我想設置一個項目,其中我有兩個模塊common-libapp匕首2:Gradle模塊依賴於在另一個模塊中的實現

lib模塊有它自己的Dagger組件和模塊,它應該是味道不可知的。

現在,它的一部分取決於模塊app中聲明的特定風味資源值,所以我嘗試通過接口抽象組件並覆蓋模塊app中的實現。

Dagger模塊聲明common-lib gradle模塊,滿足與NoOp實現的依賴關係。

@Module 
public class NetworkConfigModule { 
    @Provides 
    @Singleton 
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){ 
     return noOpHeaderParams; 
    } 

    @Provides 
    @Singleton 
    AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){ 
     return noOpAppHostsProvider; 
    } 
} 

匕首模塊申報app gradle這個模塊,滿足實際執行的依賴。

@Module 
public class NetworkConfigModule { 

    @Provides 
    @ApplicationScope 
    HeaderParams providesHeaderParams(KaufdaHeaderParams kaufdaHeaderParams){ 
     return kaufdaHeaderParams; 
    } 

    @Provides 
    @ApplicationScope 
    AppHostsProvider providesAppHostsProvider(KaufdaAppHostsProvider implementation){ 
     return implementation; 
    } 
} 

這不起作用,因爲Dagger並沒有重寫Module類,但這是某種預期。

我的問題是,我該怎麼設置我的匕首模塊,所以我可以在common-lib使用HeaderParamsAppHostsProvider接口,但我在app注入它們的實現。

回答

2

最簡單的方法是隻處理app中的組件創建。

在您的應用程序中,您知道要使用的實際模塊和類。如果您在那裏創建組件,您可以將正確的模塊添加到該組件,注入您的類並完成。


如果您不想在應用程序中處理注入,您需要定義一個接口,例如,

interface NetworkComponentHolder { 
    NetworkComponent getNetworkComponent(); 
} 

然後反過來,你可以用你的Applicationapp實現。同樣,你會在你的app創建組件和模塊,但隨後從你的模塊,你可以調用

((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this); 

這將是2點的可能性,而無需使用反射。

+0

嗨大衛,謝謝你的回答,這聽起來不錯,但我仍然在努力把你的第二個建議的每一部分...... 如果NetworkComponentHolder和NetworkComponent都在'common-lib' gradle模塊中,是不是我面臨同樣的問題,因爲我不能提供他們的依賴關係的實現? – mdelolmo

+0

@mdelolmo您將使應用程序實現接口,然後您可以獲得對庫中應用程序的引用,並使用該接口訪問該組件。這是如果你需要在你的模塊中調用'component.inject(this)'某個地方 –