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