我有一个用例,它似乎表明需要在Toothpick DI库中提供类似scope.removeModules(...)
的东西。
在安卓应用程序中,我有一个模块,它创建了一个绑定到类的绑定,该类通过改装库接口与服务器对话。实际的服务器url是在创建类时指定的,因此作为模块的构造函数参数提供:
class NetworkModule(serverUrl: String) {
init {
bind(MyServerApi::class.java).toInstance(createMyApi(serverUrl));
}
}
现在的问题是,这个模块是一个应用程序范围的模块,必须添加到应用程序范围(根范围)中,但是serverUrl
可以稍后由用户重新配置。这意味着MyServerApi
将需要重新创建。一旦url被更改,就可以删除并再次将整个模块添加到根范围,这似乎是一件很棒的事情。
通过这种方式,整个应用程序仍然能够执行Toothpick.openScope(getApplication())
,并访问与正确的serverUrl
对话的MyServerApi
的最新配置实例。
我想知道我是否错过了这个库所做的一些设计选择,这些选择可以在不向库中添加removeModules()
方法的情况下实现上述功能?
没有办法删除TP中的模块。这样做会使作用域处于一种奇怪的状态,因为模块绑定的一些依赖项仍将保留,而模块中的初始绑定将不再存在。老实说,甚至很难给出一个明确的语义来说明这意味着什么。
但是,好的一面是,您可以使用TP实现对绑定的彻底清除:只需为它们声明一个特殊的作用域并关闭这个作用域。它将正确而干净地删除所有内容,所有本应在与绑定相同的作用域中实例化或回收的内容也将被删除,同时确保其上作用域的完整性。
只需在应用程序作用域的正下方添加一个中间作用域,并确保所有作用域在打开时都将其用作父作用域。