@IntoMap @Binds 如何与 Dagger 一起工作?

Posted

技术标签:

【中文标题】@IntoMap @Binds 如何与 Dagger 一起工作?【英文标题】:How @IntoMap @Binds exactly works with Dagger? 【发布时间】:2019-12-08 18:17:06 【问题描述】:

我正在使用Dagger,我想将@injectRepository 转换为我的ViewModel,所以我创建了一个抽象模块,其中我Map 存储库类:

我的抽象模块:

@Module
abstract class RepositoryModule

    @Binds
    @IntoMap
    @ClassKey(RepositoryStatus::class)
    abstract fun provideRepositoryStatus(repositoryStatus: RepositoryStatus): RepositoryStatus

我的ViewModel 模块,其中我包含RespositoryModule

@Module(includes = [
    RepositoryModule::class
])
abstract class ViewModelModule 
    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    abstract fun bindsMainViewModel(viewModel: MainViewModel): ViewModel

我不知道这到底是怎么工作的,Dagger 怎么知道我有一张地图并且我将它与我的ViewModel 绑定?因为我从不使用该方法。而且我有一个包含在图表中的地图,所以我认为除非我调用它,否则它无法使用。

【问题讨论】:

【参考方案1】:

@Binds 类似于@Provides,只是它用于提供接口、抽象类或在您的案例中扩展的类。所以不需要任何配置,也不需要@Provides 调用。

虽然@IntoMap 用作将您的密钥put 放入映射的命令,但在您的情况下,密钥由@ClassKey@ViewModelKey 提供,而值由@Binds 提供。

还请查看文档,因为我的解释是针对您的具体情况的。但这是基本的。来自 Daggers Javadoc:

@Binds

注解委托绑定的模块的抽象方法。为了 例如,要将 Random 绑定到 SecureRandom,模块可以声明 以下:@Binds 抽象随机 bindRandom(SecureRandom 安全随机); @Binds 方法是 Provides 的替代品 仅返回注入参数的方法。更喜欢@Binds 因为生成的实现可能更高效。

@IntoMap

方法的返回类型构成了 a 值的类型参数 Map>,以及带注释的键和 返回值作为键/值对贡献给映射。这 Map> 由值的积累产生的将是 不可变。

【讨论】:

但是 Map 不像 Observable 模式?当我映射一个类时,它应该是实习生图的一部分,那么我应该不得不从某个地方“观察”这个类吗?就像把这张地图再次转换成一个类一样 Maps 是数据结构,而不是模式。 但它们是 android 内部图的一部分,对吧?不像一个普通的物体。 你没有得到地图,你只是指示匕首将它们放入地图中。之后,正确的依赖来自@Inject yes。 这样想,你给我5个银行账户,每个账户都有密码。我是匕首,我把你的帐户和密码放在地图上。当您请求帐号 1 时,我要求输入密码,如果正确我给您。

以上是关于@IntoMap @Binds 如何与 Dagger 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

flask-sqlalchemy用法详解

'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set.

如何在仍然使用 Dagger2 的同时解决循环依赖?

基于闭包实现的显示与隐藏

从Node.JS中的外部.js文件调用方法

SQLAlchemy