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

时间:2017-10-15 21:33:38

标签: android dependency-injection toothpick-di

我有一个用例似乎表明需要在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())访问MyServerApiserverUrl对话的最新配置实例。

我想知道我是否遗漏了这个库所做的一些设计选择,这样可以在不向库中添加removeModules()方法的情况下实现上述目的?

1 个答案:

答案 0 :(得分:0)

无法删除TP中的模块。这样做会使范围处于一种奇怪的状态,因为模块的绑定的某些依赖关系仍然会被保留,而模块中的初始绑定将不再存在。老实说,即使给出一个明确的语义,这也很难。

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

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