有没有办法将模块重新添加到Toothpick DI库中的Scope



我有一个用例,它似乎表明需要在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实现对绑定的彻底清除:只需为它们声明一个特殊的作用域并关闭这个作用域。它将正确而干净地删除所有内容,所有本应在与绑定相同的作用域中实例化或回收的内容也将被删除,同时确保其上作用域的完整性。

只需在应用程序作用域的正下方添加一个中间作用域,并确保所有作用域在打开时都将其用作父作用域。