android - 使用 Toothpick DI 注入仿制药
问题描述
我一直在玩 ToothPick DI,我遇到了一种情况,我需要向演示者注入几个泛型,但我不知道该怎么做,或者是否有可能。这是我正在尝试做的一个例子。
这是演示者的示例:
@InjectConstructor
class MyPresenter(
private val interactor1: Interactor1,
private val interactor2: Interactor2,
private val issuesList: List<Issue>,
private val navigator: Page<Parameter>) {
......
}
让我们假设interactor1 和interactor2 通过注解或模块正确注入,但是List 和Page 仍然缺少绑定。
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)
})
}
}
根据我的经验,我无法将Page或List与 Toothpick 绑定,因为它无法注入泛型类型,我错了吗?
谢谢!
解决方案
你是对的,Toothpick 不能注入泛型类型。解决方案是使用命名绑定或包装泛型。
假设您有两个列表 - 一个String
类型和一个Int
类型。你可以这样做:
命名绑定
// 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>
包装
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
这更像是一种解决方法,但它可能是一个很好的解决方案
在我使用的两个示例toInstace
中,您当然可以自由选择其他绑定方法。
推荐阅读
- microservices - 将单体应用拆分为微服务时如何定义 API 网关 URL
- react-native - 在 react-native 中更新 redux 状态后重新渲染屏幕
- java - 在完成未来成功后显示通知
- android - AndroidX 找不到 support-v4.aar
- elastic-stack - Filebeat 给出:[error] 的对象映射尝试将字段 [error] 解析为对象,但找到了具体值
- html - ol>li 编号变得混乱
- javascript - 使用 JavaScript 使 AngularJS 表单页面变脏
- unity3d - 在 DLL 中使用带有统一性的 MessagePack
- botframework - 如何将机器人的回复附加到网络聊天中?
- c# - Splat 中的默认视图合同