@IntoMap @Binds 如何与 Dagger 一起工作?
Posted
技术标签:
【中文标题】@IntoMap @Binds 如何与 Dagger 一起工作?【英文标题】:How @IntoMap @Binds exactly works with Dagger? 【发布时间】:2019-12-08 18:17:06 【问题描述】:我正在使用Dagger
,我想将@inject
Repository
转换为我的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 模式?当我映射一个类时,它应该是实习生图的一部分,那么我应该不得不从某个地方“观察”这个类吗?就像把这张地图再次转换成一个类一样Map
s 是数据结构,而不是模式。
但它们是 android 内部图的一部分,对吧?不像一个普通的物体。
你没有得到地图,你只是指示匕首将它们放入地图中。之后,正确的依赖来自@Inject
yes。
这样想,你给我5个银行账户,每个账户都有密码。我是匕首,我把你的帐户和密码放在地图上。当您请求帐号 1 时,我要求输入密码,如果正确我给您。以上是关于@IntoMap @Binds 如何与 Dagger 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set.