2015-07-13 60 views
1

我有一些關於dagger2的問題,我覺得很難理解。此代碼:Dagger 2構造函數注入和更多

@Module 
public class AppModule { 

    private MainApplication applicationContext; 

    @Inject 
    public AppModule(MainApplication context){ 
     this.applicationContext = context; 
    } 

    @Provides 
    @Singleton 
    StuffA provideStuffA(){ 
     return new StuffA(); 
    } 

    @Provides 
    @Singleton 
    StuffB provideStuffB(StuffA){ 
     return new StuffB(stuffA); 
    } 
} 

而在應用程序類:

appComponent = DaggerAppComponent.builder() 
       .appModule(new AppModule(this)) 
       .build(); 

我的第一個問題是:

  • 如果我想模塊分成2個,provideStuffA在ModuleA和provideStuffB在ModuleB,我怎麼能做到這一點,考慮B取決於A.

第二個問題:

  • 我有一個對象,我正在使用的應用程序類,它是從應用程序類我叫從活動注射。那麼我如何訪問應用程序類中的那個對象=?我應該在Dagger構建東西之後,在我的applicationClass上調用注入嗎?

最後一個問題

  • 想象我有兩個模塊,我需要在同一活動中使用不同的依賴性。讓一個組件和不同的模塊在同一個活動中注入的正確方法是什麼?

PS。對不起,如果這真的是基本的東西,但我覺得文檔很差,缺乏實例。在先進的感謝

回答

1

回答1

你只是在兩個單獨的模塊分割。匕首將建立圖表,當在某個點provideStuffB()被稱爲它將注入它與StuffA。順便說一句,我認爲有在provide方法小語法錯誤,它應該是(stuffA參數缺失):

@Provides 
@Singleton 
StuffB provideStuffB(StuffA stuffA){ 
    return new StuffB(stuffA); 
} 

答案2

是的,這是通常的方式。在創建圖形之後(在onCreate()中),您注入this(應用程序)。請注意,在使用此方法進行單元測試時存在一個細微的警告 - Application對象將在調用setUp()方法之前創建,因此您將無法設置/交換測試組件(並且您最終將始終使用默認值零件)。解決方案是使用圖的延遲初始化,即當第一個活動(或服務或BroadcastReceiver等)調用getApplication().getInjector(this)時,您將不得不在該點創建圖。

答案3

你通常有一個頂部Component包含所有模塊和子組件。它(必須)能夠注入所有活動。實際上,頂層組件用於生成圖形。這裏是一個真實應用程序的例子:

@Component(modules = {IzgubenoDaggerModule.class, 
         AcraDaggerModule.class, 
         AppInfoDaggerModule.class, 
         SessionDaggerModule.class, 
         ComponentManagerDaggerModule.class, 
         NetworkInfoProviderDaggerModule.class, 
         DeviceInfoProviderDaggerModule.class, 
         KhRestExchangeManagerDaggerModule.class 
        }) 
@Singleton 
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent { 
    void inject(IzgubenoApplication app); 
    void inject(Act_Main act); 
    void inject(Act_ContactDetails act); 
    void inject(Act_MyPets act); 
    void inject(Act_PetEdit act); 
    void inject(Act_PetManage act); 
    void inject(Act_PetPics act); 
    //... 
    GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod, 
              KhRestDaggerModule khrestMod, 
              AppInfoDaggerModule appInfoMod, 
              GgServerDaggerModule ggServMod, 
              GgClientDaggerModule ggClientMod); 
    //... 
}