Dagger2 進階 (四)

組織Component

Component之間的關係有 依賴(dependencies),包含(SubComponent),繼承方式(extends)。我們在一個項目之中不可能只使用一個Component連接器來注入對象完成注入工作,一般除了一個全局的ApplicationComponent之外,還有一些作用域在Activity/Fragment的Component,Component之間存在依賴關係與從屬關係。如果我們已經創建好了一個全局的ApplicationComponent,然後其它的Component剛好需要ApplicationComponent裏面的一個全局屬性,想要與ApplicationComponent共享同一個實例,這時就需要用到依賴關係了。

依賴方式

一個Component可以依賴一個或多個Component,並拿到被依賴Component暴露出來的實例,Component的dependencies屬性就是確定依賴關係的實現。
這裏的有點像數學裏面的交集方式,被依賴的Component主動暴露對象給二者共享,如我們在ApplicationModule提供了一個全局的Gson對象,我們想要提供給其他Component時,要在ApplicationComponent顯式的提供一個接口:

@PreApp
@Component (modules = AppModule.class)
public interface AppComponent {

  void inject(BaseActivity baseActivity);
  Context context();
}


@Module
public class AppModule {

  private  AppApplication application;

  public AppModule(AppApplication application) {
    this.application = application;
  }
  @Provides @PreApp Context provideContext(){
    return application;
  }
}

activity對應的component修改

@PreActivity
@Component(dependencies = AppComponent.class ,modules = MainActivityModule.class)
public interface MainActivityComponent {
  void inject(MainActivity mainActivity);
}
//注入
component = DaggerMainActivityComponent.builder()
        .appComponent(AppApplication.getAppComponent())
        .mainActivityModule(new MainActivityModule())
        .build();
    component.inject(this);

包含方式(從屬方式)@SubComponent

如果我們需要父組件全部的提供對象,這時我們可以用包含方式而不是用依賴方式,相比於依賴方式,包含方式不需要父組件顯式顯露對象,就可以拿到父組件全部對象。且SubComponent只需要在父Component接口中聲明就可以了。

繼承方式
用一個Component繼承另外一個Component。

注意
- Component依賴另一個Component,它們的作用域不能相同。
- 包含的方式,作用域可以與包含它的Component一致。
- Component的作用域必須與對應的Module作用域一致,如果@Module沒有標記作用域,就不影響。

github地址:https://github.com/zhangyuesx215/Dagger2-MVP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章