Dagger2多模塊項目Component組織方式選擇(二)

本文適合有必定的Dagger2使用基礎的同窗android

上一篇:Dagger2多模塊項目Component組織方式選擇(一)
下一篇:[dagger.android多模塊項目實現(一)]()git

上一篇文章咱們講了普通多模塊項目dagger2 Component用繼承(SubComponent)方式實現,這一篇咱們來講說組件化的項目使用依賴(dependencies)怎麼實現。github

項目模塊結構以下圖
segmentfault

在組件化多模塊項目中,app模塊只在最終打包的時候直接依賴user,news模塊,當user,news做爲單獨APP來運行時與app不存在依賴關係了,因此Appcomponent不能放在app模塊中了這種狀況下應該放在base中。 app

然而若是放在base模塊中,base沒有user,news的依賴,沒法使用註冊UserComponent和NewsComponent因此這時候不能再使用SubComponent方法來實現依賴了ide

這種狀況下只能使用dependencies方式 組件化

base模塊中:ui

@Module
class AppModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "app"
    }
}

@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance context: Context): AppComponent
    }
}

class BaseApplication : Application() {
    lateinit var appComponent: AppComponent
    override fun onCreate() {
        super.onCreate()
        instance = this
        appComponent = DaggerAppComponent.factory().create(this)
    }

    companion object {
        lateinit var instance: BaseApplication
    }
}

這裏AppComponent放在BaseApplication中,這樣user,news模塊能夠直接使用 this

user模塊:spa

@Module
class UserModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "user"
    }
}

@UserScope
@Component(modules = [UserModule::class], dependencies = [AppComponent::class])
interface UserComponent {
    fun inject(userActivity: UserActivity)
}

news模塊

@Module
class NewsModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "news"
    }
}

@NewsScope
@Component(modules = [NewsModule::class], dependencies = [AppComponent::class])
interface NewsComponent {
    fun inject(newsActivity: NewsActivity)
}

要生成NewsComponent和UserComponent必須先獲得AppComponent,經過如下方法來建立

val newsComponent = DaggerNewsComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
 val userComponent = DaggerUserComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
object NewsComponentHolder {
    val newsComponent: NewsComponent by lazy {
        DaggerNewsComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
    }
}
object UserComponentHolder {
    val userComponent: UserComponent by lazy {
        DaggerUserComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
    }
}

最後在Activity中使用和前一篇同樣

class NewsActivity : AppCompatActivity() {

    @Inject
    lateinit var set: Set<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_news)
        NewsComponentHolder.newsComponent.inject(this)
        text.text = set.toString()
    }
}

class UserActivity : AppCompatActivity() {

    @Inject
    lateinit var set: Set<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        UserComponentHolder.userComponent.inject(this)
        text.text = set.toString()
    }
}

代碼地址

相關文章
相關標籤/搜索