1. 程式人生 > >Dagger2 進階 (四)

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沒有標記作用域,就不影響。