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

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