gpt4 book ai didi

Android HILT SingletonComponent vs GoF Singleton 实例设计模式

转载 作者:行者123 更新时间:2023-12-04 23:42:13 32 4
gpt4 key购买 nike

在 Android 项目中,有一个作为单例实现的外观。我认为使用 HILT SingletonComponent 将其转换为 DI 是一个更好的主意。

@Module
@InstallIn(SingletonComponent::class)
object MyManagerModule {
@Provides
fun provide(@ApplicationContext context: Context): MyManager {
return MyManager(context)
}
}

class MyManager @Inject constructor(@ApplicationContext private val ctx: Context){
//
}
从几个调用者那里,我使用 HILT 字段注入(inject)获得了上述 MyManager 的实例,即
@AndroidEntryPoint
class MyCallerFragment : Fragment() {
@Inject lateinit var myManager: MyManager
// ...
在调试器中,我观察到 DI 实例实际上是 不是 同一个实例(假设这些 fragment 在同一个 Activity 生命周期中)。我想我一定误解了 Hilt DI :-( 如果你看到我的盲点,我很想听听任何解释。

最佳答案

TL;博士
您需要使用注解 @Singleton .这将告诉 Hilt 在整个应用程序中使用相同的 MyManager 实例。
绑定(bind)范围
根据the documentation :

By default, all bindings in Hilt are unscoped. This means that each time your app requests the binding, Hilt creates a new instance of the needed type.



However, Hilt also allows a binding to be scoped to a particular component. Hilt only creates a scoped binding once per instance of the component that the binding is scoped to, and all requests for that binding share the same instance.

@Singleton注释将您的 Hilt 绑定(bind)范围限定为应用程序组件。 (包括所有子组件,它们都是组件)因此 Hilt 将在整个应用程序中注入(inject)对象的相同实例。
this guide 中有一个例子由谷歌。 @InstallIn注解
注释 @InstallIn()告诉 Hilt 将在哪个组件中注入(inject) MyManager 对象。
在您的情况下 @InstallIn(SingletonComponent::class) , Hilt 将使 MyManager 可用于注入(inject)应用程序组件和该组件的所有子组件,但这并不意味着 Hilt 将提供相同的实例。由于任何默认组件都是应用程序组件的子组件,因此 MyManager 当前可用于在任何组件中进行注入(inject)。 (根据 the documentation)

关于Android HILT SingletonComponent vs GoF Singleton 实例设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67407521/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com