android跨模块调用类,在多模块应用中使用 Dagger

注意:本文中提到的模块是指 Gradle 模块,而不是 Dagger 模块。

包含多个 Gradle 模块的项目称为多模块项目。在作为单个 APK 发布且不包含动态功能模块的多模块项目中,通常具有一个可依赖于项目中大多数模块的 app 模块和一个其他模块通常可依赖的 base 或 core 模块。app 模块通常包含 Application 类,而 base 模块包含在项目中所有模块之间共享的所有通用类。

app 模块非常适合用来声明应用组件(例如,下图中的 ApplicationComponent),应用组件可以提供其他组件可能需要的对象以及应用的单例。例如,像 OkHttpClient 这样的类、JSON 解析器、数据库的访问函数或可能在 core 模块中定义的 SharedPreferences 对象,都将由 app 模块中定义的 ApplicationComponent 提供。

在 app 模块中,还可以包含一些生命周期较短的其他组件。例如,在用户登录后,该模块中可能会包含具有用户专属配置的 UserComponent(比如 UserSession)。

在项目的不同模块中,您可以定义至少一个具有该模块的专属逻辑的子组件,如图 1 所示。

2e063d03c8118de0dc335254b7ac7301.png

图 1. 多模块项目中的 Dagger 图示例

例如,在 login 模块中,您可以定义采用自定义 @ModuleScope 注释来限定范围的 LoginComponent 组件,该组件可提供相应功能(例如 LoginRepository)的常用对象。在该模块内,您还可以定义依赖于具有其他自定义范围的 LoginComponent 的其他组件,例如将 @FeatureScope 用于 LoginActivityComponent 或 TermsAndConditionsComponent,您可以在这两个组件中定义更加特定于功能的逻辑,例如 ViewModel 对象。

对于其他模块(例如 Registration),您需要进行类似的设置。

多模块项目的一般规则是同级模块不应相互依赖。如果它们相互依赖,请考虑相应共享逻辑(它们之间的依赖关系)是否应该是父级模块的一部分。如果应该,请进行重构以将这些类移动到父级模块;如果不应该,请创建一个可扩展父级模块的新模块,并使两个原始模块都扩展新模块。

最佳做法:在以下情况下,您通常需要在模块中创建一个组件:

对于 LoginActivityComponent,您需要执行字段注入。

对于 LoginComponent,您需要限定对象的范围。

如果并非以上两种情况并且您需要告知 Dagger 如何从相应模块提供对象,请使用 @Provides 或 @Binds 方法创建和提供 Dagger 模块,但前提是这些类不支持构造函数注入。

使用 Dagger 子组件进行实现

在 Android 应用中使用 Dagger 文档页面介绍了如何创建和使用子组件。但是,由于功能模块无法识别 app 模块,因此您无法使用相同的代码。例如,如果您考虑使用我们在上一页中介绍的代码来构建典型的登录流程,系统将无法再进行编译:

Kotlin

class LoginActivity: Activity() {

...

override fun onCreate(savedInstanceState: Bundle?) {

// Creation of the login graph using the application graph

loginComponent = (applicationContext as MyDaggerApplication)

.appComponent.loginComponent().create()

// Make Dagger instantiate @Inject fields in LoginActivity

loginComponent.inject(this)

...

}

}Java

public class LoginActivity extends Activity {

...

@Override

protected void onCreate(Bundle savedInstanceState) {

// Creation of the login graph using the application graph

loginComponent = ((MyApplication) getApplicationContext())

.appComponent.loginComponent().create();

// Make Dagger

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值