1

我有一个用例似乎表明需要scope.removeModules(...)Toothpick DI 库中提供类似的东西。

在一个 Android 应用程序中,我有一个模块,它创建一个与类的绑定,该类通过 Retrofit-library 接口与服务器通信。实际的服务器 url 在创建该类时指定,因此作为模块的构造函数参数提供:

class NetworkModule(serverUrl: String) {
   init {
     bind(MyServerApi::class.java).toInstance(createMyApi(serverUrl));
   }
}

现在的问题是这个模块是一个应用程序范围的模块,必须添加到应用程序范围(根范围),但serverUrl用户稍后可以重新配置。这意味着MyServerApi需要重新创建。一旦更改了 url,就能够将整个模块删除 + 再次添加到根范围,这似乎很棒。

这样,整个应用程序仍然可以Toothpick.openScope(getApplication())访问并访问最新配置的MyServerApi与正确的对话实例serverUrl

我想知道我是否遗漏了这个库做出的一些设计选择,而无需向removeModules()库中添加方法就可以实现上述目标?

4

1 回答 1

0

在 TP 中无法删除模块。这样做会使作用域处于一种奇怪的状态,因为模块绑定的一些依赖关系仍将被保留,而模块中的初始绑定将不再存在。老实说,甚至很难给出明确的语义来说明这意味着什么。

但是,好消息是您可以使用 TP 彻底清除绑定:只需为它们声明一个特殊范围并关闭此范围。它将正确且干净地删除所有内容,所有应该在与绑定相同的范围内实例化或回收的内容也将被清除,同时确保其上方范围的完整性。

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

于 2017-10-15T23:45:10.317 回答