如何订购 Dagger 多重绑定?

问题描述 投票:0回答:1

例如,需要在某处提供一组绑定:

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 键,但最终并不是那么优雅。

android kotlin dagger-hilt dagger
1个回答
0
投票

因此 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)
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.