例如,需要在某处提供一组绑定:
class Farm @Inject constructor(
private val animals: Set<@JvmSuppressWildcards Animal>,
){
init {
animals.forEach { feed(it) }
}
}
以及绑定(可能位于不同的 gradle 模块中):
//module A
@Binds
@IntoSet
abstract fun goat(goat: Goat): Animal
//module B
@Provides
@IntoSet
fun cow(): Animal = Cow(...)
我们如何确保绑定顺序正确(并首先喂山羊)?
例如,在 Spring Boot 中,有相应的顺序注释 https://www.baeldung.com/spring-order
我可以使用 IntoMap 来代替 int 键,但最终并不是那么优雅。
因此 Dagger 默认情况下在集合上进行多重绑定,而不是在列表上。 集合没有顺序,并且不保证集合中的两次行走具有相同的顺序。
您可以提供 Map 多重绑定。 在这种形式中,它不是注入一个集合,而是注入一个
Map<String, Type>
。 如果您使用可排序的字符串键(例如使用数字并对其 toInt 进行排序),则可以使用它来提供排序。 但这需要您制定一些代码规则,因为编译器不会强制执行它。
Map多重绑定的使用方法是这样的:
@Provides @IntoMap
@StringKey("1")
fun cow(): Animal = Cow()
然后将其作为地图
类 Farm @Inject 构造函数( 私人val动物:设置<@JvmSuppressWildcards Animal>, ){
init {
//sort the entries by the integer value of the key, then feed them in order
animals.entries.sortedBy {it.key.toInt()}.forEach {
feed(it.value)
}
}
}