Android 用牙签注射仿制药
我一直在玩牙签DI,我现在的情况是,我需要向演示者注入一些仿制药,但我不知道怎么做,或者是否可能。这是一个我正在尝试做的例子 这是演示者的一个示例: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
@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!!我最终选择了包装选项,但我肯定会尝试命名选项:)