Skip to content

3、依赖注入

JailedBird edited this page Dec 5, 2023 · 1 revision

0、模块化序言

ModuleExpose方案使用模块暴露&依赖注入框架Hilt的方式,实现模块间通信:

  • 使用模块暴露(模块api化)解决基础模块下沉问题
  • 使用依赖注入框架Hilt实现基于接口的模块解耦方案

基于模块暴露(ModuleExpose)的相关接口,可以使用依赖注入框架Hilt实现基于接口的解耦; 当然如果大家不使用Hilt技术栈的话,这节可以跳过;

本节内容会以业务模块search和settings为例,通过代码展示:

  • search模块跳转到settings模块,打开SettingsActivity
  • settings模块跳转到search模块,打开SearchActivity

PS:关于Hilt的配置和导入,本项目直接沿用nowinandroid工程中build-logic的配置,具体配置和使用请参考本项目和nowinandroid项目;

1、基本配置&工程结构:

导入脚本之后,使用includeWithExpose导入对应模块,各自生成对应的module_expose,如下图:

image-20231204171057867

image-20231204171204479

注意,请将*_expose/添加到gitignore,避免expose模块提交到git

2、业务模块接口暴露&实现

settings模块expose目录下暴露SettingExpose接口, 脚本会自动将其同步拷贝到settings_expose中对应expose目录

image.png

exposeimpl/SettingExposeImpl实现SettingExpose接口的具体功能,完善跳转功能

class SettingExposeImpl @Inject constructor() : SettingExpose {
    override fun startSettingActivity(context: Context) {
        SettingsActivity.start(context)
    }
}

3、Hilt添加注入接口绑定

使用Hilt绑定全局单例SettingExpose接口实现,其对应实现为SettingExposeImpl

image.png

4、search模块compileOnly导入settings_expose

compileOnly(projects.feature.settingsExpose)

注意,模块暴露依赖只能使用compileOnly,保证编译时候能找到对应文件即可;另外projects.feature.settingsExpose这种项目导入方式,需要在settings.gradle.kts启用project类型安全配置;

 enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

5、search注入并使用SettingExpose

@AndroidEntryPoint
class SearchActivity : AppCompatActivity() {
    @Inject
    lateinit var settingExpose: SettingExpose
    
    private val listener = object : AppSettingsPopWindow.Listener {

        override fun settings() {
            settingExpose.startSettingActivity(this@SearchActivity)
        }
    }
}

6、实现解耦

最终实现【search模块跳转到settings模块,打开SettingsActivity】, 至于【settings模块跳转到search模块,打开SearchActivity】的操作完全一致,不重复叙述了;

7、参考资料

1、思路原创:微信Android模块化架构重构实践

2、项目原创:github/tyhjh/module_api

3、脚本迁移:将 build 配置从 Groovy 迁移到 KTS

4、参考文章:Android模块化设计方案之接口API化

5、Nowinandroid:https://github.com/android/nowinandroid

6、Dagger项目:https://github.com/google/dagger

7、Hilt官方教程:https://developer.android.com/training/dependency-injection/hilt-android

基于模块暴露和Hilt的安卓模块通信方案

Clone this wiki locally