关于android:Dagger2多模块项目Component组织方式选择二

28次阅读

共计 2550 个字符,预计需要花费 7 分钟才能阅读完成。

本文适宜有肯定的 Dagger2 应用根底的同学

上一篇:Dagger2 多模块我的项目 Component 组织形式抉择 (一)
下一篇:[dagger.android 多模块我的项目实现(一)]()

上一篇文章咱们讲了一般多模块我的项目 dagger2 Component 用继承 (SubComponent) 形式实现,这一篇咱们来说说组件化的我的项目应用依赖 (dependencies) 怎么实现。

我的项目模块构造如下图

在组件化多模块我的项目中,app 模块只在最终打包的时候间接依赖 user,news 模块,当 user,news 作为独自 APP 来运行时与 app 不存在依赖关系了,所以 Appcomponent 不能放在 app 模块中了这种状况下应该放在 base 中。

然而如果放在 base 模块中,base 没有 user,news 的依赖,无奈应用注册 UserComponent 和 NewsComponent 所以这时候不能再应用 SubComponent 办法来实现依赖了

这种状况下只能应用 dependencies 形式

base 模块中:

@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 模块能够间接应用

user 模块:

@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()}
}

代码地址

正文完
 0