我有一个用例似乎表明需要在Toothpick DI库中提供类似scope.removeModules(...)
的内容。
在Android应用程序中,我有一个模块,它创建一个绑定到类的绑定,通过Retrofit-library接口与服务器通信。实际的服务器URL是在创建该类时指定的,因此作为Module的构造函数参数提供:
class NetworkModule(serverUrl: String) {
init {
bind(MyServerApi::class.java).toInstance(createMyApi(serverUrl));
}
}
现在问题是这个模块是一个应用程序范围的模块,必须添加到应用程序范围(根范围),但用户可以稍后重新配置serverUrl
。这意味着需要重新创建MyServerApi
。并且看起来如果能够在更改url后再删除+将整个模块再次添加到根作用域,那就太棒了。
这样整个应用仍然可以Toothpick.openScope(getApplication())
访问MyServerApi
与serverUrl
对话的最新配置实例。
我想知道我是否遗漏了这个库所做的一些设计选择,这样可以在不向库中添加removeModules()
方法的情况下实现上述目的?
答案 0 :(得分:0)
无法删除TP中的模块。这样做会使范围处于一种奇怪的状态,因为模块的绑定的某些依赖关系仍然会被保留,而模块中的初始绑定将不再存在。老实说,即使给出一个明确的语义,这也很难。
但是,好处是您可以使用TP完全消除绑定:只需为它们声明一个特殊范围并关闭此范围。它将正确,干净地删除所有内容,所有应该在与绑定相同的范围内实例化或回收的内容也将被清除,同时确保其上方范围的完整性。
只需在应用程序范围正下方添加一个中间范围,并确保所有范围在打开时将其用作父级。