Android 用牙签注射仿制药

Android 用牙签注射仿制药,android,generics,dependency-injection,toothpick-di,Android,Generics,Dependency Injection,Toothpick Di,我一直在玩牙签DI,我现在的情况是,我需要向演示者注入一些仿制药,但我不知道怎么做,或者是否可能。这是一个我正在尝试做的例子 这是演示者的一个示例: @InjectConstructor class MyPresenter( private val interactor1: Interactor1, private val interactor2: Interactor2, private val issuesList: List<Issue>, pr

我一直在玩牙签DI,我现在的情况是,我需要向演示者注入一些仿制药,但我不知道怎么做,或者是否可能。这是一个我正在尝试做的例子

这是演示者的一个示例:

@InjectConstructor
class MyPresenter(
    private val interactor1: Interactor1,
    private val interactor2: Interactor2,
    private val issuesList: List<Issue>,
    private val navigator: Page<Parameter>) {

    ......

}
@InjectConstructor
类MyPresenter(
私有val interactor1:interactor1,
私有val interactor2:interactor2,
私人val发行列表:列表,
专用val导航器:第页){
......
}
让我们想象一下,interactor1和interactor2是通过注释或模块正确注入的,但是列表和页面仍然缺少绑定

class MyActivity: Activity {
    
    private val listOfIssues: List<Issue> = ...
    private val navigationPage: Page<Parameter> = ....

    @Override fun onCreate(savedInstanceState: Bundle?) {
        Toothpick.openRootScope()
           .openSubScope(this)
           .installModules(module {
               bind(??).toInstance(listOfIssues)
               bind(??).toInstance(navigationPage)
           })
    }
}
类MyActivity:Activity{
private val listOfIssues:List=。。。
专用val导航页面:页面=。。。。
@重写创建时的乐趣(savedInstanceState:Bundle?){
牙签。openRootScope()
.openSubScope(本)
.installModules(模块{
绑定到实例(问题列表)
绑定(?)到实例(导航页)
})
}
}
根据我的经验,我不能用牙签绑定页面列表,因为它不能注入泛型类型,我错了吗


谢谢

你说得对,牙签不能注射泛型。解决方案是使用命名绑定或包装泛型

假设您有两个列表-一个是
String
type,另一个是
Int
type。以下是您如何做到这一点:

命名绑定

// Binding
bind<List<*>>().withName("String").toInstance(yourStringList)
bind<List<*>>().withName("Int").toInstance(yourIntList)

// Usage
@Inject
@field:Named("Int")
lateinit var intList: List<Int>

@field:Named("String")
@Inject
lateinit var stringList: List<String>
//绑定
bind().withName(“字符串”).toInstance(您的字符串列表)
bind().withName(“Int”).toInstance(yourIntList)
//用法
@注入
@字段:命名(“Int”)
lateinit var intList:List
@字段:命名(“字符串”)
@注入
lateinit var stringList:列表
包装

class IntList : List<Int> by listOf()
class StringList : List<String> by listOf()

bind<IntList>().toInstance(yourIntList)
bind<StringList>().toInstance(yourStringList) 

@Inject
lateinit var intList: IntList

@Inject
lateinit var stringList: StringList
class IntList:List by listOf()
类StringList:按listOf()列出
bind().toInstance(您的IntList)
bind().toInstance(您的StringList)
@注入
lateinit var intList:intList
@注入
lateinit变量stringList:stringList
这更像是一个解决办法,但它可能是一个很好的解决方案


在这两个示例中,我都使用
来安装
,但您当然可以自由选择其他绑定方法。

回答得好Nilzor!!我最终选择了包装选项,但我肯定会尝试命名选项:)