簡體   English   中英

為什么我仍然需要使用帶有依賴注入庫 (Hilt) 的 singleton 類?

[英]Why do I still need to use singleton classes with a dependency injection library (Hilt)?

官方 android 文檔建議使用諸如Hilt之類的依賴注入庫而不是手動依賴注入的原因之一是難以重用對象。 而且我必須應用 singleton 模式,這使得測試更加困難,因為所有測試共享相同的 singleton 實例。 所以 Hilt 應該替換 singleton 類。

但是我在檢查向日葵樣品時發現它仍然使用帶有 Hilt 的 singleton 圖案。

App 數據庫聲明為 singleton:

// For Singleton instantiation
@Volatile private var instance: AppDatabase? = null

fun getInstance(context: Context): AppDatabase {
    return instance ?: synchronized(this) {
        instance ?: AppDatabase.buildDatabase(context).also { instance = it }
    }
}

DatabaseModule也適用於應用程序容器:

@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {

    @Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return AppDatabase.getInstance(context)
    }

    //...
}

在這里使用 singleton 模式對我來說沒有意義,因為通過使用@Singleton注釋@Provides provideDatabase()方法。 Hilt確保在整個應用生命周期中只使用一個實例。

Hilt不應該也替換 singleton 模式嗎?

官方 android 文檔建議使用諸如Hilt之類的依賴注入庫而不是手動依賴注入的原因之一是難以重用對象。 而且我必須應用 singleton 模式,這使得測試更加困難,因為所有測試共享相同的 singleton 實例。 所以 Hilt 應該替換 singleton 類。

但是我在檢查向日葵樣品時發現它仍然使用帶有 Hilt 的 singleton 圖案。

App 數據庫聲明為 singleton:

// For Singleton instantiation
@Volatile private var instance: AppDatabase? = null

fun getInstance(context: Context): AppDatabase {
    return instance ?: synchronized(this) {
        instance ?: AppDatabase.buildDatabase(context).also { instance = it }
    }
}

DatabaseModule也適用於應用程序容器:

@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {

    @Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return AppDatabase.getInstance(context)
    }

    //...
}

在這里使用 singleton 模式對我來說沒有意義,因為通過使用@Singleton注釋@Provides provideDatabase()方法。 Hilt確保在整個應用生命周期中只使用一個實例。

Hilt不應該也替換 singleton 模式嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM